SpringCloudZuul網關過濾器

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過濾器處理之後,就沒有其他類型的過濾器來接手了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章