https://mp.weixin.qq.com/s/xYU8e6uM5e7bdebI7qjuSwhtml
經過以前博客發佈的《Spring Cloud構建微服務架構(五)服務網關》一文,相信你們對於Spring Cloud Zuul已經有了一個基礎的認識。經過前文的介紹,咱們對於Zuul的第一印象一般是這樣的:它包含了對請求的路由和過濾兩個功能,其中路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎;而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。然而實際上,路由功能在真正運行時,它的路由映射和請求轉發都是由幾個不一樣的過濾器完成的。其中,路由映射主要經過pre類型的過濾器完成,它將請求路徑與配置的路由規則進行匹配,以找到須要轉發的目標地址;而請求轉發的部分則是由route類型的過濾器來完成,對pre類型過濾器得到的路由地址進行轉發。因此,過濾器能夠說是Zuul實現API網關功能最爲核心的部件,每個進入Zuul的HTTP請求都會通過一系列的過濾器處理鏈獲得請求響應並返回給客戶端。spring
下面,咱們就經過本文來詳細瞭解一下Spring Cloud Zuul的過濾器!如下內容節選自《Spring Cloud微服務實戰》,稍作加工。微信
在Spring Cloud Zuul中實現的過濾器必須包含4個基本特徵:過濾類型、執行順序、執行條件、具體操做。這些元素看着彷佛很是的熟悉,實際上它就是ZuulFilter接口中定義的四個抽象方法:架構
1 2 3 4 5 6 7 String filterType(); int filterOrder(); boolean shouldFilter(); Object run();
它們各自的含義與功能總結以下:app
上一節中,對於Spring Cloud Zuul中的過濾器類型filterType,咱們已經作過一些簡單的介紹,Zuul默認定義了四個不一樣的過濾器類型,它們覆蓋了一個外部HTTP請求到達API網關,直到返回請求結果的所有生命週期。下圖源自Zuul的官方WIKI中關於請求生命週期的圖解,它描述了一個HTTP請求到達API網關以後,如何在各個不一樣類型的過濾器之間流轉的詳細過程。
從上圖中,咱們能夠看到,當外部HTTP請求到達API網關服務的時候,首先它會進入第一個階段pre,在這裏它會被pre類型的過濾器進行處理,該類型的過濾器主要目的是在進行請求路由以前作一些前置加工,好比請求的校驗等。在完成了pre類型的過濾器處理以後,請求進入第二個階段routing,也就是以前說的路由請求轉發階段,請求將會被routing類型過濾器處理,這裏的具體處理內容就是將外部請求轉發到具體服務實例上去的過程,當服務實例將請求結果都返回以後,routing階段完成,請求進入第三個階段post,此時請求將會被post類型的過濾器進行處理,這些過濾器在處理的時候不只能夠獲取到請求信息,還能獲取到服務實例的返回信息,因此在post類型的過濾器中,咱們能夠對處理結果進行一些加工或轉換等內容。另外,還有一個特殊的階段error,該階段只有在上述三個階段中發生異常的時候纔會觸發,可是它的最後流向仍是post類型的過濾器,由於它須要經過post過濾器將最終結果返回給請求客戶端(實際實現上還有一些差異,後續介紹)。ide
在Spring Cloud Zuul中,爲了讓API網關組件能夠更方便的上手使用,它在HTTP請求生命週期的各個階段默認地實現了一批覈心過濾器,它們會在API網關服務啓動的時候被自動地加載和啓用。咱們能夠在源碼中查看和了解它們,它們定義於spring-cloud-netflix-core模塊的org.springframework.cloud.netflix.zuul.filters包下。
函數
如上圖所示,在默認啓用的過濾器中包含了三種不一樣生命週期的過濾器,這些過濾器都很是重要,能夠幫助咱們理解Zuul對外部請求處理的過程,以及幫助咱們如何在此基礎上擴展過濾器去完成自身系統須要的功能。下面,咱們將逐個地對這些過濾器作一些詳細的介紹:微服務
《Spring Cloud實戰小貼士:Zuul處理Cookie和重定向》 一文中提到的加載敏感頭信息加入到忽略頭信息的操做調用就在PreDecorationFilter過濾器中實現。源碼分析
SendForwardFilter:它的執行順序爲500,是route階段第三個執行的過濾器。該過濾器只對請求上下文中存在forward.to參數的請求進行處理,即用來處理路由規則中的forward本地跳轉配置。post
這裏不列出具體代碼了,讀者可自行根據類名來查看源碼瞭解詳細處理過程。下圖是對上述過濾器根據順序、名稱、功能、類型作了綜合的整理,能夠幫助咱們在自定義過濾器或是擴展過濾器的時候用來參考並全面地考慮整個請求生命週期的處理過程。
本文節選自《Spring Cloud微服務實戰》,轉載請註明出處
活動推薦:Spring Cloud技術沙龍 - 北京站
活動時間:2017年 5 月 6 日 13:00-17:00
活動地點:北京市海淀區上地五街開拓路 11 號福道大廈
Agenda
13:00-13:40 簽到
14:00-14:30 王鴻飛: Spring Cloud 在新浪商業產品中的實戰應用
14:30-15:00 許進:Spring Cloud Zuul 與網關中間件
15:00-15:30 劉思賢:基於 Spring Cloud 的微服務實踐
15:30-16:00 現場抽獎 & 茶歇
16:00-16:30 張英磊:Spring Cloud 在雲計算 SaaS 中的實戰經驗分享
16:30-17:00 程天亮:Spring Boot 在鏈家網實踐
報名請至:http://www.hdb.com/party/rrt4b.html
版權聲明
本文采用 CC BY 3.0 CN協議 進行許可。 可自由轉載、引用,但需署名做者且註明文章出處。如轉載至微信公衆號,請在文末添加做者公衆號二維碼。
長按指紋
一鍵關注