Spring Cloud Alibaba——Sentinel核心概念

本篇主要先講解幾個Sentinel中的核心概念,加深對它的理解。

  • Resource
  • Slot
  • Context
  • Entry
  • Node
  • Metric

Resource

Resource 是Sentinel中最重要的一個概念,代表一個資源。任何后面需要保護的內(nèi)容都可抽象成為資源。Sentinel 通過資源來保護具體的業(yè)務(wù)代碼或其他后方服務(wù)。用戶只需要為受保護的代碼或服務(wù)定義一個資源,然后針對這個資源定義規(guī)則即可。 資源和規(guī)則是相互解耦的,資源的規(guī)則甚至可以在運行時動態(tài)修改。

當我們定義完資源,可以通過在程序中埋點來保護我們的服務(wù)。通常有兩種方式:

  • try{…}catch{…} (使用SphU.entry(…)方法),當 catch 到BlockException時執(zhí)行異常處理(或fallback)

  • if{…}else{…}(使用SphO.entry(…)方法),當返回false時執(zhí)行異常處理(或fallback)

從0.1.1版本開始,Sentinel支持通過注解的方式進行資源定義,使用@SentinelResource注解。通過注解除了可以定義資源外,還可以指定blockHandler、fallback方法。

Sentinel中具體的資源類為:ResourceWrapper,這是一個抽象包裝類,包裝了name和EntryType。默認有兩個實現(xiàn)類:StringResourceWrapper(對字符串包裝,這是一個通用的資源類)和MethodResourceWrapper(針對方法調(diào)用的包裝)

類圖如下:


Slot

插槽。Sentinel的整個工作流程就是圍繞一個個插槽組成的插槽鏈展開的。每個插槽都有自己的職責(zé),通過一定的編排順序,來達到最終限流降級的目的。默認提供的插槽執(zhí)行順序是固定的,因為有的插槽需要其他插槽的執(zhí)行結(jié)果才能工作。

當然并不是說完全不能修改。Sentinel的插槽編排順序通過SlotChainBuilder的SPI接口來實現(xiàn),默認使用DefaultSlotChainBuilder。當然我們可以自定義自己的SPI實現(xiàn),來對插槽順序重新編排。

Sentinel默認提供了8個插槽,每個Slot各司其職:

  • NodeSelectorSlot:負責(zé)收集資源的路徑,并將這些資源的調(diào)用路徑,以樹狀結(jié)構(gòu)存儲起來,用于根據(jù)調(diào)用路徑來限流降級。

  • ClusterBuilderSlot:用于存儲資源的統(tǒng)計信息以及調(diào)用者信息,例如該資源的 RT, QPS, thread count 等等,這些信息將用作為多維度限流,降級的依據(jù)。

  • LogSlot:異常情況記錄日志。

  • StatisticSlot:用于記錄,統(tǒng)計不同緯度的 runtime 信息。

  • AuthoritySlot:根據(jù)黑白名單,來做黑白名單控制。

  • SystemSlot:通過系統(tǒng)的狀態(tài),例如 load1 等,來控制總的入口流量。

  • FlowSlot:用于根據(jù)預(yù)設(shè)的限流規(guī)則,以及前面 slot 統(tǒng)計的狀態(tài),來進行限流。

  • DegradeSlot:通過統(tǒng)計信息,以及預(yù)設(shè)的規(guī)則,來做熔斷降級。

同時我們可以通過ProcessorSlot的SPI接口來加入自定義的Slot,以實現(xiàn)特定功能。


Context

Context上下文Sentinel運行時一個調(diào)用鏈的元數(shù)據(jù)存儲區(qū)。主要的元數(shù)據(jù)有:

  • entranceNode:當前調(diào)用鏈的入口節(jié)點。
  • curEntry:當前調(diào)用鏈的當前entry。
  • node:與當前entry所對應(yīng)的curNode。
  • origin:當前調(diào)用鏈的調(diào)用源。

每次調(diào)用 SphU.entry() 或 SphO.entry()時,當框架沒有找到對應(yīng)的Context時,就會創(chuàng)建一個Context對象來存儲元數(shù)據(jù)信息。當然我們可以通過收到調(diào)用的方式提前準備好Context,調(diào)用方法是:com.alibaba.csp.sentinel.context.ContextUtil#enter(java.lang.String, java.lang.String)

Context存儲在ThreadLocal中的,也就是說他是一個線程上下文。當我們執(zhí)行entry完成后,需要清理這個ThreadLocal,需要執(zhí)行entry.exit()方法,該方法也會進行鏈式調(diào)用,當發(fā)現(xiàn)parent==null時,也就代表執(zhí)行到了最上層的節(jié)點,此時會清空Context。

Entry

Entry 是 Sentinel 中用來表示是否通過限流的一個憑證,就像一個token一樣。每次執(zhí)行 SphU.entry() 或 SphO.entry() 都會返回一個 Entry 給調(diào)用者,意思就是告訴調(diào)用者,如果正確返回了 Entry 給你,那表示你可以正常訪問被 Sentinel 保護的后方服務(wù)了,否則 Sentinel 會拋出一個BlockException(如果是 SphO.entry() 會返回false),這就表示調(diào)用者想要訪問的服務(wù)被保護了,也就是說調(diào)用者本身被限流了。

entry中保存了本次執(zhí)行 entry() 方法的一些基本信息,包括:

  • createTime:當前Entry的創(chuàng)建時間,主要用來后期計算rt
  • node:當前Entry所關(guān)聯(lián)的node,該node主要是記錄了當前context下該資源的統(tǒng)計信息
  • origin:當前Entry的調(diào)用來源,通常是調(diào)用方的應(yīng)用名稱,在 ClusterBuilderSlot.entry() 方法中設(shè)置的
  • resourceWrapper:當前Entry所關(guān)聯(lián)的資源

Node

Node 中保存了資源的實時統(tǒng)計數(shù)據(jù),例如:passQps,blockQps,rt等實時數(shù)據(jù)。正是有了這些統(tǒng)計數(shù)據(jù)后, Sentinel 才能進行限流、降級等一系列的操作。

node是一個接口,他有一個實現(xiàn)類:StatisticNode,但是StatisticNode本身也有兩個子類,一個是DefaultNode,另一個是ClusterNode,DefaultNode又有一個子類叫EntranceNode。

其中entranceNode是每個上下文的入口,該節(jié)點是直接掛在root下的,是全局唯一的,每一個context都會對應(yīng)一個entranceNode。另外defaultNode是記錄當前調(diào)用的實時數(shù)據(jù)的,每個defaultNode都關(guān)聯(lián)著一個資源和clusterNode,有著相同資源的defaultNode,他們關(guān)聯(lián)著同一個clusterNode。

上個圖說明一下:


Metric

Metric 是 Sentinel 中用來進行實時數(shù)據(jù)統(tǒng)計的度量接口,node就是通過metric來進行數(shù)據(jù)統(tǒng)計的。而metric本身也并沒有統(tǒng)計的能力,他也是通過Window來進行統(tǒng)計的。

結(jié)構(gòu)如下:


至此我們簡單了解了Sentinel里的幾個核心概念。

參考:
https://blog.csdn.net/qq_19414183/article/details/111032084

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容