Sentinel 流程分析

最近公司開始作新的項目。新項目準備用點新的技術。以前咱們採用的是spring cloud的那一套。以前幾個月看到阿里開始擁抱springcloud,推出好幾個組件無縫兼容現有springcloud。我尤爲喜歡Sentinel 的qps控制。這是以前Hystrix所缺失的。因此此次準備試下阿里的這套springcloud。java

Sentinel 的文檔寫的很是詳細,基本上咱們把Sentinel 的項目clone下來,對着文檔用一遍就會使用了。關於使用方面的咱們能夠看這裏  https://github.com/alibaba/Sentinel/wiki/如何使用git

今天咱們主要看一下Sentinel 的大體流程。github

程序的入口咱們就從 com.alibaba.csp.sentinel.demo.authority.AuthorityDemo 這個類開始 spring

核心代碼以下app

這行代碼  ContextUtil.enter(resource, origin);框架

是創建調用上下文ui

在執行完  entry = SphU.entry(resource); 代碼以後在內存中生成如下結構:3d

      machine-root
                 /     
                /
         EntranceNode1
              /
             /   
      DefaultNode(resource)

咱們的重點就是這行代碼。一直點進去直到 com.alibaba.csp.sentinel.CtSph#entryWithPriority 方法code

在分析這個方法以前呢。咱們首先要了解下Sentinel的slotblog

 

在 Sentinel 裏面,全部的資源都對應一個資源名稱以及一個 Entry。Entry 能夠經過對主流框架的適配自動建立,也能夠經過註解的方式或調用 API 顯式建立;每個 Entry 建立的時候,同時也會建立一系列功能插槽(slot chain)。這些插槽有不一樣的職責,例如:

NodeSelectorSlot 負責收集資源的路徑,並將這些資源的調用路徑,以樹狀結構存儲起來,用於根據調用路徑來限流降級;
ClusterBuilderSlot 則用於存儲資源的統計信息以及調用者信息,例如該資源的 RT, QPS, thread count 等等,這些信息將用做爲多維度限流,降級的依據;
StatisticSlot 則用於記錄、統計不一樣緯度的 runtime 指標監控信息;
FlowSlot 則用於根據預設的限流規則以及前面 slot 統計的狀態,來進行流量控制;
AuthoritySlot 則根據配置的黑白名單和調用來源信息,來作黑白名單控制;
DegradeSlot 則經過統計信息以及預設的規則,來作熔斷降級;
SystemSlot 則經過系統的狀態,例如 load1 等,來控制總的入口流量;

 因此實際上Sentinel是經過這些插槽實現了他的功能。如今咱們再看上面的方法。ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper); 這行代碼即是獲取插槽

 

 咱們重點須要關注 newSlotChain 方法是如何建立SlotChain的

初始化的時候builder仍是null,因此會執行 resolveSlotChainBuilder。resolveSlotChainBuilder主要是爲了擴展使用的

Sentinel經過SPI機制擴展 SlotChainBuilder,因此未來咱們能夠經過這種方法自定義Sentinel。resolveSlotChainBuilder方法執行完成後默認返回的是DefaultSlotChainBuilder,他就會去構造出整個slot責任鏈

拿到 slot責任鏈以後咱們咱們回到最初的代碼

如今開始咱們就能夠去執行每一個slot的邏輯。

每一個slot的結構都同樣,咱們已AuthoritySlot爲例

 

方法 checkBlackWhiteAuthority 是AuthoritySlot的核心邏輯。

首先經過AuthorityRuleManager獲取獲得全部的規則,AuthorityRuleManager是受權規則的管理類,能夠動態獲取從dashboard增長的規則。

而後調用AuthorityRuleChecker的pass方法進行受權規則的校驗,若是返回false說明被攔截了,則拋出一個異常

若是一切順利則會執行fireEntry去調用下一個slot的方法

就這樣,Sentinel經過slot實現了相應的功能,同時使用了SPI的機制,使咱們個性化定製Sentinel很是容易

相關文章
相關標籤/搜索