zuul入門(2)zuul 的關鍵組件和用途
1、ContextLifecycleFilter
2、ZuulServlet 接收請求
ZuulServlet
類似SpringMvc的DispatcherServlet
,所有的Request都要經過ZuulServlet
的處理,因此ZuulServlet
是zuul框架源碼分析的入口點。
zuul邏輯的入口是ZuulServlet.service(ServletRequest servletRequest, ServletResponse servletResponse)
。
RequestContext
提供了執行filter Pipeline所需要的Context,因為Servlet是單例多線程,這就要求RequestContext即要線程安全
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。- PRE: 該類型的filters在Request routing到源web-service之前執行。用來實現Authentication、選擇源服務地址等
- ROUTING:該類型的filters用於把Request routing到源web-service,源web-service是實現業務邏輯的服務。這裏使用HttpClient請求web-service。
- POST:該類型的filters在ROUTING返回Response後執行。用來實現對Response結果進行修改,收集統計數據以及把Response傳輸會客戶端。
- 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 的關鍵組件和用途