前言
Zuul 是在Spring Cloud Netflix平台上提供動態路由,監控,彈性,安全等邊緣服務的框架,是Netflix基於jvm的路由器和服務器端負載均衡器,相當於是設備和 Netflix 流應用的 Web 網站后端所有請求的前門。本文基於上篇(SpringCloud系列——Ribbon 負載均衡)實現Zuul動態路由
GitHub地址:https://github.com/Netflix/zuul
代碼編寫
首先我們在springCloud下面新建一個springboot項目:zuul-server,pom繼承parent,並且在Eureka上面注冊(還不會服務注冊與發現的,請戳:SpringCloud系列——Eureka 服務注冊與發現)
maven引入Zuul
<!-- Zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
配置文件
server.port=10010 spring.application.name=zuul-server eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/ #健康檢查(需要spring-boot-starter-actuator依賴) eureka.client.healthcheck.enabled=true # 續約更新時間間隔(默認30秒) eureka.instance.lease-renewal-interval-in-seconds=10 # 續約到期時間(默認90秒) eureka.instance.lease-expiration-duration-in-seconds=10 #zuul代理配置 zuul.routes.服務名.path,服務名要與注冊的一致 #應用名映射 zuul.routes.myspringboot.path=/myspringboot/** zuul.routes.myspringboot.service-id=myspringboot #URL映射 #zuul.routes.myspringboot.path=/myspringboot/** #zuul.routes.myspringboot-url.url=http://localhost:10087/
自定義Zuul過濾器
更多的檢查規則后續慢慢健全
/** * Zuul過濾器,實現了路由檢查 */ public class AccessFilter extends ZuulFilter { /** * 通過int值來定義過濾器的執行順序 */ @Override public int filterOrder() { // PreDecoration之前運行 return PRE_DECORATION_FILTER_ORDER - 1; } /** * 過濾器的類型,在zuul中定義了四種不同生命周期的過濾器類型: * public static final String ERROR_TYPE = "error"; * public static final String POST_TYPE = "post"; * public static final String PRE_TYPE = "pre"; * public static final String ROUTE_TYPE = "route"; */ @Override public String filterType() { return PRE_TYPE; } /** * 過濾器的具體邏輯 */ @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); System.out.println(String.format("%s AccessFilter request to %s", request.getMethod(),request.getRequestURL().toString())); String accessToken = request.getParameter("accessToken"); //有權限令牌 if (!StringUtils.isEmpty(accessToken)) { ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(200); //可以設置一些值 ctx.set("isSuccess", true); return null; } else { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); ctx.setResponseBody("{\"result\":\"accessToken is not correct!\"}"); //可以設置一些值 ctx.set("isSuccess", false); return null; } } /** * 返回一個boolean類型來判斷該過濾器是否要執行 */ @Override public boolean shouldFilter() { return true; } }
啟動類
添加@EnableZuulProxy注解並使用自定義過濾器
@EnableZuulProxy @SpringBootApplication public class ZuulServerApplication { public static void main(String[] args) { SpringApplication.run(ZuulServerApplication.class, args); } @Bean public AccessFilter accessFilter() { return new AccessFilter(); } }
效果演示
啟動所有項目,我們在Eureka上注冊了四個服務,相比上篇(SpringCloud系列——Ribbon 負載均衡)多了一個Zuul
瀏覽器訪問 http://localhost:10010/myspringboot/feign/ribbon、http://localhost:10010/myspringboot/feign/ribbon?accessToken=123456
http://localhost:10010/ 這個端口對外暴露,相對於總入口,后面接不同的路徑由,Zuul路由到對應的服務上
1、沒有accessToken是,無法通過檢查
2、攜帶accessToken時,可正常路由,並且Feign調用、Ribbon負載均衡
后記
我們為什么要使用Zuul呢?
1、請求校驗、路由轉發,接口校驗與業務邏輯分離
2、隱藏諸多服務路徑,只暴露統一入口,安全
更多Zuul配置,請看官方文檔
代碼開源
代碼已經開源、托管到我的GitHub、碼雲: