ZuulFilter接口抽象類
Spring Cloud Zuul中實現的過濾器必須包含4個基本特徵:過濾類型、執行順序、執行條件、具體操作。
對應以下四個方法:
String filterType();該函數需要返回一個字符串來代表過濾器的類型,這個類型就是在HTTP請求過程中定義的各個階段。在Zuul中默認定義了4種不同生命週期的過濾器類型:
pre 可以在請求被路由之前調用
routing 在路由請求時被調用
post 在routing和error過濾器之後被調用
error 處理請求時發生錯誤時被調用
int filterOrder();通過int值來定義過濾器的執行順序,數值越小優先值越高。
boolean shouldFilter(); 返回一個boolean值來判斷該過濾器是否要執行。
Object run(); 過濾器的具體邏輯。
本文介紹Spring Cloud Zuul的核心過濾器。
默認啓用的過濾器有三種,對應三種不同的生命週期。
pre過濾器
ServletDetectionFilter:-3,最先被執行的過濾器,用來檢測當前的請求是通過Spring的DispatcherServlet處理運行的,還是ZuulServlet來處理運行的。
Servlet30WrapperFilter:-2,是第二個被執行的過濾器。主要是爲了將原始的HttpServletRequest包裝成Servlet30RequestWrapper對象。
FromBodyWrapperFilter:-1,第三個被執行的過濾器。僅對兩類請求生效,第一類是Content-Type爲application/x-www-form-urlencoded的請求,第二類是Content-Type爲multipart/form-data並且是由Spring的DispatcherServlet處理的請求。 該過濾器的主要目的是將符合要求的請求體包裝成FormBodyRequestWrapper對象。
DebugFilter:1,第四個被執行的過濾器。
PreDecorationFilter:5,第五個被執行的過濾器。該過濾器會判斷當前請求上下文中是否存在forward.to和serviceId參數,如果都不存在,那麼它就會執行具體過濾器的操作(如果有一個存在的話,說明當前請求已經被處理過了,因爲這兩個信息就是根據當前請求的路由信息加載進來的)
route過濾器
RibbonRoutingFilter:10,route階段的第一個過濾器。只對請求上下文中存在serviceId參數的請求進行處理,即只對通過serviceId配置路由規則的請求生效。
SimpleHostRoutingFilter:100,它的執行順序爲100,是route階段第二個過濾器。只對請求上下文中存在routeHost參數的請求進行處理,即只對通過url配置路由規則的請求生效。
SendForwardFilter:500,是route階段最後一個過濾器,該過濾器只對請求上下文中存在forward.to參數的請求進行處理。
post過濾器
SendErrorFilter:0,POST階段的第一個過濾器,僅在請求上下文中包含error.status_code參數並且還沒有被該過濾器處理過的時候執行。
SendResponseFilter:1000,POST階段的最後一個過濾器,該過濾器會檢查請求上下文中是否包含請求響應相關的頭信息、響應數據流或是響應體,只有在包含它們其中一個時候執行處理邏輯。
ErrorFilter過濾器的不足
try {
preRoute();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
postRoute();
} catch (ZuulException e) {
error(e);
return;
}
pre、route、post階段產生的異常都會被error過濾器捕捉並且進行處理,但是由post階段產生的異常,在經過error過濾器處理之後,就沒有其他類型的過濾器來接手了。