java B2B2C Springcloud多租戶電子商城系統-Zuul過濾器詳解

過濾器是Zuul實現API網關功能最爲核心的部件,每一個進入Zuul的HTTP請求都會經過一系列的過濾器處理鏈得到請求響應並返回給客戶端。
在Spring Cloud Zuul中實現的過濾器必須包含4個基本特徵:過濾類型、執行順序、執行條件、具體操作,這四個操作就是IZuulFilter接口以及ZuulFilter抽象類(ZuulFilter實現了IZuulFilter)和中定義的四個抽象方法:
需要JAVA Spring Cloud大型企業分佈式微服務雲構建的B2B2C電子商務平臺源碼請加企鵝:壹零叄八柒柒肆六二六
String filterType();

int filterOrder();

boolean shouldFilter();

Object run();
它們各自的含義與功能總結如下:

filterType:該函數需要返回一個字符串來代表過濾器的類型,而這個類型就是在HTTP請求過程中定義的各個階段。在Zuul中默認定義了四種不同生命週期的過濾器類型,具體如下:
pre:可以在請求被路由之前調用。
routing:在路由請求時候被調用。
post:在routing和error過濾器之後被調用。
error:處理請求時發生錯誤時被調用。
filterOrder:通過int值來定義過濾器的執行順序,數值越小優先級越高。
shouldFilter:返回一個boolean類型來判斷該過濾器是否要執行。我們可以通過此方法來指定過濾器的有效範圍。
run:過濾器的具體邏輯。在該函數中,我們可以實現自定義的過濾邏輯,來確定是否要攔截當前的請求,不對其進行後續的路由,或是在請求路由返回結果之後,對處理結果做一些加工等。

核心過濾器
在Spring Cloud Zuul中,爲了讓API網關組件可以更方便的上手使用,它在HTTP請求生命週期的各個階段默認地實現了一批覈心過濾器,它們會在API網關服務啓動的時候被自動地加載和啓用。我們可以在源碼中查看和了解它們,它們定義於spring-cloud-netflix-core模塊的org.springframework.cloud.netflix.zuul.filters包下。

pre過濾器

ServletDetectionFilter:它的執行順序爲-3,是最先被執行的過濾器。該過濾器總是會被執行,主要用來檢測當前請求是通過Spring的DispatcherServlet處理運行,還是通過ZuulServlet來處理運行的。它的檢測結果會以布爾類型保存在當前請求上下文的isDispatcherServletRequest參數中,這樣在後續的過濾器中,我們就可以通過RequestUtils.isDispatcherServletRequest()和RequestUtils.isZuulServletRequest()方法判斷它以實現做不同的處理。一般情況下,發送到API網關的外部請求都會被Spring的DispatcherServlet處理,除了通過/zuul/路徑訪問的請求會繞過DispatcherServlet,被ZuulServlet處理,主要用來應對處理大文件上傳的情況。另外,對於ZuulServlet的訪問路徑/zuul/,我們可以通過zuul.servletPath參數來進行修改。

Servlet30WrapperFilter:它的執行順序爲-2,是第二個執行的過濾器。目前的實現會對所有請求生效,主要爲了將原始的HttpServletRequest包裝成Servlet30RequestWrapper對象。

FormBodyWrapperFilter:它的執行順序爲-1,是第三個執行的過濾器。該過濾器僅對兩種類請求生效,第一類是Content-Type爲application/x-www-form-urlencoded的請求,第二類是Content-Type爲multipart/form-data並且是由Spring的DispatcherServlet處理的請求(用到了ServletDetectionFilter的處理結果)。而該過濾器的主要目的是將符合要求的請求體包裝成FormBodyRequestWrapper對象。

DebugFilter:它的執行順序爲1,是第四個執行的過濾器。該過濾器會根據配置參數zuul.debug.request和請求中的debug參數來決定是否執行過濾器中的操作。而它的具體操作內容則是將當前的請求上下文中的debugRouting和debugRequest參數設置爲true。由於在同一個請求的不同生命週期中,都可以訪問到這兩個值,所以我們在後續的各個過濾器中可以利用這兩值來定義一些debug信息,這樣當線上環境出現問題的時候,可以通過請求參數的方式來激活這些debug信息以幫助分析問題。另外,對於請求參數中的debug參數,我們也可以通過zuul.debug.parameter來進行自定義。

PreDecorationFilter:它的執行順序爲5,是pre階段最後被執行的過濾器。該過濾器會判斷當前請求上下文中是否存在forward.to和serviceId參數,如果都不存在,那麼它就會執行具體過濾器的操作(如果有一個存在的話,說明當前請求已經被處理過了,因爲這兩個信息就是根據當前請求的路由信息加載進來的)。而它的具體操作內容就是爲當前請求做一些預處理,比如:進行路由規則的匹配、在請求上下文中設置該請求的基本信息以及將路由匹配結果等一些設置信息等,這些信息將是後續過濾器進行處理的重要依據,我們可以通過RequestContext.getCurrentContext()來訪問這些信息。另外,我們還可以在該實現中找到一些對HTTP頭請求進行處理的邏輯,其中包含了一些耳熟能詳的頭域,比如:X-Forwarded-Host、X-Forwarded-Port。另外,對於這些頭域的記錄是通過zuul.addProxyHeaders參數進行控制的,而這個參數默認值爲true,所以Zuul在請求跳轉時默認地會爲請求增加X-Forwarded-*頭域,包括:X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-For、X-Forwarded-Prefix、X-Forwarded-Proto。我們也可以通過設置zuul.addProxyHeaders=false關閉對這些頭域的添加動作。

注意:在Spring Cloud系列(二十四) 路由詳解(Finchley.RC2版本)文中提到了忽略把敏感頭信息過濾掉的操作就是在PreDecorationFilter中執行的。

route過濾器

RibbonRoutingFilter:它的執行順序爲10,是route階段第一個執行的過濾器。該過濾器只對請求上下文中存在serviceId參數的請求進行處理,即只對通過serviceId配置路由規則的請求生效。而該過濾器的執行邏輯就是面向服務路由的核心,它通過使用Ribbon和Hystrix來向服務實例發起請求,並將服務實例的請求結果返回。
SimpleHostRoutingFilter:它的執行順序爲100,是route階段第二個執行的過濾器。該過濾器只對請求上下文中存在routeHost參數的請求進行處理,即只對通過url配置路由規則的請求生效。而該過濾器的執行邏輯就是直接向routeHost參數的物理地址發起請求,從源碼中我們可以知道該請求是直接通過httpclient包實現的,而沒有使用Hystrix命令進行包裝,所以這類請求並沒有線程隔離和斷路器的保護。
SendForwardFilter:它的執行順序爲500,是route階段第三個執行的過濾器。該過濾器只對請求上下文中存在forward.to參數的請求進行處理,即用來處理路由規則中的forward本地跳轉配置。

post過濾器

LocationRewriteFilter:它的執行順序是900,於重定向時,負責將標頭重寫爲Zuul的URL,否則,瀏覽器會重定向到Web應用程序的URL而不是Zuul URL。
SendResponseFilter:它的執行順序爲1000,是post階段最後執行的過濾器。該過濾器會檢查請求上下文中是否包含請求響應相關的頭信息、響應數據流或是響應體,只有在包含它們其中一個的時候就會執行處理邏輯。而該過濾器的處理邏輯就是利用請求上下文的響應信息來組織需要發送回客戶端的響應內容。

error過濾器

SendErrorFilter:它的執行順序爲0,是post階段第一個執行的過濾器。該過濾器僅在請求上下文中包含error.status_code參數(由之前執行的過濾器設置的錯誤編碼)並且還沒有被該過濾器處理過的時候執行。而該過濾器的具體邏輯就是利用請求上下文中的錯誤信息來組織成一個forward到API網關/error錯誤端點的請求來產生錯誤響應。

java B2B2C 源碼 多級分銷springmvc mybatis多租戶電子商城系統來源

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