springcloud系列23——Zuul的過濾器
阿新 • • 發佈:2018-12-10
Zuul的過濾器
Zuul過濾器簡介
spring cloud Zuul包含了對請求的路由和過濾2個功能。路由功能負責將請求轉發到具體的微服務上,而過濾器負責對請求的處理過程進行干預,是實現許可權校驗、服務聚合等功能的基礎。
在實際執行時,路由對映和請求轉發是由幾個不同的過濾器完成的。每一個進入zuul的http請求都會經過一系列的過濾器處理鏈得到請求響應並返回給客戶端。
spring cloud zuul包含4種類型的過濾器。
- pre過濾器。在請求被路由之前呼叫。Zuul請求微服務之前。比如請求身份驗證,選擇微服務例項,記錄除錯資訊等。
- route過濾器。負責轉發請求到微服務。原始請求在此構建,並使用Apache HttpClient或Netflix Ribbon傳送原始請求。
- post過濾器。在route和error過濾器之後被呼叫。可以在響應新增標準HTTP Header、收集統計資訊和指標,以及將響應傳送給客戶端等。
- error過濾器。在處理請求發生錯誤時被呼叫。
除了預設的Filter,Zuul還允許我們建立自定義的過濾器型別。比如,我們可以自定義一個STATIC型別的過濾器,它在Zuul中生成響應,而不是將請求轉發給具體的微服務。
Zuul請求的生命週期如下:
自定義Zuul過濾器
新建模組microservice-gateway-zuul-filter。
新增Zuul和Eureka客戶端的依賴:
<dependency>
< groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency >
application.yml:
spring:
application:
name: microservice-gateway-zuul-filter
server:
port: 8809
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true
zuul:
routes:
user1:
path: /user/**
serviceId: microservice-springcloud-user
stripPrefix: false
logging:
level:
com.netflix: debug
定義一個pre型別的過濾器,記錄請求的URI。
public class MyZuulPreFilter extends ZuulFilter {
private final static Logger LOGGER = org.slf4j.LoggerFactory.getLogger(MyZuulPreFilter.class);
@Override
public String filterType() {
return "pre"; // 指定過濾器型別
}
@Override
public int filterOrder() {
return 0; // 過濾器順序,數字越小越先執行
}
@Override
public boolean shouldFilter() {
return true; // 是否使用該過濾器。
}
// 過濾器具體執行的操作
@Override
public Object run() {
HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
String requestUri = request.getRequestURI();
LOGGER.info("請求的URI:{}",requestUri);
return null;
}
}
spring boot主類:
@SpringBootApplication
@EnableZuulProxy
public class ZuulFilterApplication
{
public static void main( String[] args )
{
SpringApplication.run(ZuulFilterApplication.class,args);
}
@Bean
public MyZuulPreFilter myZuulPreFilter() {
return new MyZuulPreFilter();
}
}
測試:
啟動Eureka Server、user模組和microservice-gateway-zuul-filter。
我們通過Zuul的host和port訪問user模組的/sample/1.
我們看下控制檯。
我們只是簡單記錄一下請求的URI。更多的用法可以參考netflix-core包中的ZuulFilter實現。