SpringCloud系列——Ribbon 負載均衡
Zuul 是在Spring Cloud Netflix平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架,是Netflix基於jvm的路由器和伺服器端負載均衡器,相當於是裝置和 Netflix 流應用的 Web 網站後端所有請求的前門。本文基於上篇(SpringCloud系列——Ribbon 負載均衡)實現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(www.weilaiyule178.com) {
return true;
}
}
複製程式碼
啟動類
新增@EnableZuulProxy註解並使用自定義過濾器
複製程式碼
@EnableZuulProxy
@SpringBootApplication
public class yongshiyule178.com ZuulServerApplication {
public static void main(String[www.michenggw.com] args) {
SpringApplication.run(ZuulServerApplication.class, args);
}
@Bean
public AccessFilter accessFilter() {
return new AccessFilter(www.yigouyule2.cn);
}
}
複製程式碼
效果演示
啟動所有專案,我們在Eureka上註冊了四個服務,相比上篇(SpringCloud系列——Ribbon 負載均衡)多了一個Zuul
這個埠對外暴露,相對於總入口,後面接不同的路徑由,Zuul路由到對應的服務上
1、沒有accessToken是,無法通過檢查
2、攜帶accessToken時,可正常路由,並且Feign呼叫、Ribbon負載均衡
後記
我們為什麼要使用Zuul呢?
1、請求校驗、路由轉發,介面校驗與業務邏輯分離
2、隱藏諸多服務路徑,只暴露統一入口,安全
更多Zuul配置,請看官方文件