1. 程式人生 > >zuul入門(2)zuul 的關鍵組件和用途

zuul入門(2)zuul 的關鍵組件和用途

ice cti -s -1 life 處理 有一個 之間 類別

1、ContextLifecycleFilter

技術分享

2、ZuulServlet 接收請求

技術分享

ZuulServlet類似SpringMvc的DispatcherServlet,所有的Request都要經過ZuulServlet的處理,因此ZuulServlet是zuul框架源碼分析的入口點。

zuul邏輯的入口是ZuulServlet.service(ServletRequest servletRequest, ServletResponse servletResponse)

技術分享

RequestContext提供了執行filter Pipeline所需要的Context,因為Servlet是單例多線程,這就要求RequestContext即要線程安全

又要Request安全

context使用ThreadLocal保存,這樣每個worker線程都有一個與其綁定的RequestContext,因為worker僅能同時處理一個Request,這就保證了Request Context 即是線程安全的由是Request安全的。

三個核心的方法preRoute(),route(), postRoute(),zuul對request處理邏輯都在這三個方法裏,ZuulServlet交給ZuulRunner去執行。

由於ZuulServlet是單例,因此ZuulRunner也僅有一個實例。

3、ZuulServlet 處理請求:ZuulRunner - 》FilterProcessor

ZuulRunner直接將執行邏輯交由FilterProcessor處理,FilterProcessor也是單例,其功能就是依據filterType執行filter的處理邏輯:

技術分享

技術分享

FilterProcessor對filter的處理邏輯。

  • 首先根據Type獲取所有輸入該Type的filter,List<ZuulFilter> list
  • 遍歷該list,執行每個filter的處理邏輯,processZuulFilter(ZuulFilter filter)
  • RequestContext對每個filter的執行狀況進行記錄,應該留意,此處的執行狀態主要包括其執行時間、以及執行成功或者失敗,如果執行失敗則對異常封裝後拋出。
    到目前為止,zuul框架對每個filter的執行結果都沒有太多的處理,它沒有把上一filter的執行結果交由下一個將要執行的filter,僅僅是記錄執行狀態,如果執行失敗拋出異常並終止執行。

技術分享

4、重中之重:ZuulFilter

  • Type:定義filter的類別,用字符串表示,有四種標準類別,代表了Request的生命周期。filterType()返回值代表該filter的Type。

    1. PRE: 該類型的filters在Request routing到源web-service之前執行。用來實現Authentication、選擇源服務地址等
    2. ROUTING:該類型的filters用於把Request routing到源web-service,源web-service是實現業務邏輯的服務。這裏使用HttpClient請求web-service。
    3. POST:該類型的filters在ROUTING返回Response後執行。用來實現對Response結果進行修改,收集統計數據以及把Response傳輸會客戶端。
    4. ERROR:上面三個過程中任何一個出現錯誤都交由ERROR類型的filters進行處理。
  • Execution Order: 同一個Type的filters組成Pipeline,Execution Order決定他們執行的順序。filterOrder()返回值是該filter的Execution Order

  • Criteria:定義了filter執行需要滿足的條件。對應的方法是shouldFilter()
  • Action: 定了filter處理邏輯。對應的方法是run()

技術分享

5、總結一下

zuul框架主要的功能就是動態的讀取\編譯\運行這些filter。filter之間之間通過RequestContext共享狀態信息,

既然filter都是對特定Request的處理,那麽RequestContext就是Request的Context,RequestContext用來管理 Request的Context,不受其它Request的影響。

Filter源碼文件放在zuul 服務特定的目錄, zuul server會定期掃描目錄下的文件的變化。

如果有Filter文件更新,源文件會被動態的讀取,編譯加載進入服務,接下來的Request處理就由這些新加入的filter處理。

zuul入門(2)zuul 的關鍵組件和用途