最近公司開始作新的項目。新項目準備用點新的技術。以前咱們採用的是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很是容易