刘耀文

刘耀文

java开发者
github

springcloud sentinel

1. 源碼解讀分為三部分,初始化和運行過程以及擴展點#

1.1 sentinel 自身初始化#

初始化為 sentinel 在 springboot 啟動時候,做了什麼?
在引入依賴後,對 spring boot 產生了什麼副作用

我們看看依賴中包含什麼?

image-20240709114212024

有很多,可以看到經典的幾個部分,我們先看看本體 spring-cloud-starter-alibaba-sentinel 中的內容,一般看三個部分,一是自動配置類,二是 SPI 接口,再是 springboot 中的擴展點 spring.factories

我們先看看有什麼

image-20240709114953153

可以看到只是導入了自動配置類,看看裡面導入了什麼配置類

第一第二個是對 springweb 框架的適配,第三個是 sentinel 提供對外的訪問端口,第四個是初始化和定制 sentinel,第五個是對 feign 的支持,我們一個一個看,首先看 sentinel 自身的初始化

1.2 sentinel 自身的初始化,屬性初始化,數據源初始化,切面初始化,restTemplate 初始化,這部分適配了 spring 項目,在沒有使用 mvc 的情況下#

1.3 對 springMVC 的適配初始化#

2 運行過程#

2.1 springMVC 攔截器運行邏輯#

攔截器一般有兩個方法,一個是請求前的方法,一個是請求後的方法,我們先看請求前的方法

2.2 進入 chain.entry (context, resourceWrapper, null, count, prioritized, args) 看看實際的運行過程#

我們先看看 slot 接口,方便理解,

看看抽象類

ok, 現在正是進入到調用 slot 的過程中,我們按照上面的循序一個一個看#

NodeSelectorSlot,資源 node 選擇器#

我們必須先明確一點,node 是與 slotchain 綁定的,每一個唯一資源都有唯一一個 slotchain,而 slotchain 裡面保存了 node (defaultNode),並且保存了不同調用上下文的不同 node (defaultNode),官網有解說

image-20240709141403982

資源都有唯一一個 slotchain;

我們看看 NodeSelectorSlot 是怎麼實現的

ClusterBuilderSlot,資源統計節點的構建,也就是 ClusterNode#

ok,這裡邏輯很簡單,創建一個 clusterNode 統計進入信息

接著進入 LogSlot#

這裡面邏輯也比較簡單,記錄 BlockException

ok ,到了核心的 StatisticSlot#

首先判斷是否可以進入,這裡先去執行 AuthoritySlot、SystemSlot、ParamFlowSlot、FlowSlot,所以我們先去看看其他幾個 slot 的邏輯,先跳過這一節

AuthoritySlot#

SystemSlot#

ParamFlowSlot#

FlowSlot#

與 ParamFlowSlot 類似,根據 FlowRule 決定是否通過flow-control | Sentinel (sentinelguard.io)

DegradeSlot#

  • 慢調用比例 (SLOW_REQUEST_RATIO):選擇以慢調用比例作為閾值,需要設置允許的慢調用 RT(即最大的響應時間),請求的響應時間大於該值則統計為慢調用。當單位統計時長(statIntervalMs)內請求數目大於設置的最小請求數目,並且慢調用的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小於設置的慢調用 RT 則結束熔斷,若大於設置的慢調用 RT 則會再次被熔斷。
  • 異常比例 (ERROR_RATIO):當單位統計時長(statIntervalMs)內請求數目大於設置的最小請求數目,並且異常的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值範圍是 [0.0, 1.0],代表 0% - 100%。
  • 異常數 (ERROR_COUNT):當單位統計時長內的異常數目超過閾值之後會自動進行熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
  • circuit-breaking | Sentinel (sentinelguard.io)

如果前面的都通過了然後回到 StatisticSlot

3. 擴展點#

sentinel 有很多擴展點

3.1 初始化過程擴展 Initexector#

執行時機,第一次調用 enty,或者不是 Earler 模式

默認情況下,會找到集群模式下的 client 和 server 初始化以及 metric 回調函數初始化

3.2 Slot/Slot Chain 擴展#

調用時機:沒有找到資源匹配的 slotchain

3.3 Transport 擴展#

其實就是客戶端對外暴露的接口,默認也會暴露一些接口,方便查看客戶端的情況

首先有一個 API 中心負責接收外界信息

接收到之後找到適配的 handler

默認會定義一些 handle

3.4 集群流控擴展#

集群流控・alibaba/Sentinel Wiki (github.com)

此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://me.liuyaowen.club/posts/default/springcloud-sentinel


載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。