亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费

Sentinel源碼分析,了解Sentinel的整個(gè)工作流程
發(fā)布時(shí)間:2026-05-05 04:34:35

本篇內容:

    Sentinel對性能的源碼消耗如何 Sentinel工作流程源碼分析 Sentinel熔斷降級實(shí)現源碼分析 Sentinel對性能的消耗如何

Sentinel統計QPS使用的是時(shí)間窗口+Bucket,并且通過(guò)循環(huán)復用Bucket以減少對內存的分析占用,在統計QPS時(shí),工作更是流程利??用當前時(shí)間戳定位Bucket,使用LongAdder統計時(shí)間窗口內的源碼請求成功數、失敗數、分(fen)析總耗時(shí)優(yōu)化了并發(fā)鎖,工作通過(guò)定時(shí)任務(wù)遞增時(shí)間戳避免每次都使用System獲取當前時(shí)間。流程可以看到Sentinel在性能(′ω`)方面所做出的源碼努力,Sentinel盡最大可能??降低自身對應用的分析影響。

Sentin??el會(huì )為每個(gè)資源(接口)創(chuàng )建一個(gè)保存一分鐘內時(shí)間窗口為1秒的工作Bucket數組以及一個(gè)保存一秒鐘內以500ms為時(shí)間窗口的Bucket數??組,將這兩個(gè)數組包裝為一個(gè)Node,流程以統計該接口的源碼??請求數據。每個(gè)(╬?益?)Bucket記錄一個(gè)(ge)時(shí)間窗口內的分析請求總數、失敗總數、工作總耗時(shí)(通過(guò)總耗時(shí)可計算平均耗時(shí))、被限流或者被熔斷的請求總數。

因此,Sentinel(╬?益?)消耗的內存至少是資源總數乘以每個(gè)資源對應的Node占用的內存大小,每個(gè)Node占用的內存大小即為一個(gè)大小為2的Bucket數組和一個(gè)大小為60的Bucket數組所占用的內存。

Sen??tinel工作流程源碼分析

Sentinel通過(guò)復用Bu(╯°□°)╯cket降低對內存的消耗,使用LongAdder降低并發(fā)統計數據對性能的消耗,除這些之外,Sentinel通過(guò)責任鏈模式實(shí)現統計、限流、熔斷降級等功能,實(shí)現局部無(wú)鎖化。

Sentinel的基本使用:

Sentinel實(shí)現統計(°□°)、限??流、熔斷降級等功能由一個(gè)個(gè)(ge)ProcessorSlot完成,例如,統計資源當前時(shí)間窗口的請求總數、失敗總數等由StatisticSlot??完成,判斷當前請求是否需要限流由FlowSlot完成,判斷當前請求是否需要熔斷降級由DegradeSlot完成。

這些ProcessorSlot按照嚴格的順序包裝成一個(gè)鏈表,比如StatisticSlot在FlowSlot之前,FlowS??lot在DegradeSlot之前。

ProcessorSlot的entry方法在接收到客戶(hù)端請求時(shí)或者客戶(hù)端向服務(wù)端發(fā)送請求之前被調用,exit方法則是在服務(wù)端處理完請求(包括異常完成)時(shí)或者客戶(hù)端發(fā)?????送請求完成時(shí)(′?_?`)被調用。每個(gè)P??rocessorSlot通過(guò)fireEntry方法或者fireExit方法向下傳遞信號。??

看過(guò)Netty源碼的朋友應該對這種設計模式的使用并不陌生,Netty也是通過(guò)責任鏈模式將處理請求的Handler包裝為鏈表,實(shí)現局部串行處理請求。但S??entinel的ProcessorSlot與Netty的Handler(??-)?有些區別,ProcessorSlot的exit方法并不像Netty那樣是從后往前傳遞的。

我們熟悉的Shiro也是通過(guò)??責(′ω`*)任鏈實(shí)現(過(guò)濾器),所以Sentinel實(shí)現限流、熔斷并不難理解。在不考慮集群限流的情況下。當SphU的entry方法??被調(diao)用時(shí),至少會(huì )經(jīng)過(guò)StatisticSlot、FlowSlot、DegradeSl(′?_?`)ot這三個(gè)ProcessorSlot,其時(shí)序圖如下。

當StatisticSlot的entry方法被調用時(shí),由StatisticSlot根據資源獲取資源的Node,根據當前時(shí)間戳從Node獲取當前時(shí)間窗口的Bucket,然后將Bucket的請求總數自增1。StatisticSlot在entry??方法中捕獲異常,如果下游的ProcessorSlot拋出??異常為BlockException或BlockException的子類(lèi),則將Bucket的限流??總數(shu)自增1,否(′ω`)則將Bucket的異??倲底栽?。

當FlowSlot的e??ntry方法被調用時(shí),檢查為當前資源??配置的限??流規(′?ω?`)則是否滿(mǎn)足限流條件,如果滿(mǎn)足條件則拋出BlockException異常,表示當前請求被限流。由于Sentinel支持集群限流,所以限流的實(shí)現上比較復雜,我(wo)們暫不討論。如果ヾ(′ω`)?是單節點(diǎn)的限流,則實(shí)現上與熔斷降級的實(shí)現差不多,本篇只(//ω//)介紹熔斷降級的實(shí)現。

當DegradeSlot的??entry方法被調用時(shí),檢查為當前資源配置的熔斷降級規則是否滿(mǎn)足條件,如果滿(mǎn)足條件則拋出DegradeException異常,表示當前請求被熔斷。

Sentinel熔斷降級實(shí)現源碼分析

Sentinel會(huì )為每個(gè)資源(ResourceWr??apper)創(chuàng )建一個(gè)Node,用于統計請求數據(請求總數、異??倲?、被限( ???)流或被熔斷總數、總耗時(shí)),為限流和熔斷降級功能提供支持。

ResourceWrapper的name為資源名稱(chēng),也可以理解是接口url,但這樣理解是不正確的。資源名稱(chēng)在我們配置限流規則或者熔斷( ?▽?)降級規則時(shí)也用到。

ResourceWrapper的entryType為流量類(lèi)型,可取值為IN和OUT,IN表示流入類(lèi)型,即服務(wù)(wu)端接收客戶(hù)端請求;??OUT為流出類(lèi)型,即客戶(hù)端向服務(wù)端發(fā)起請求。

ResourceWrapper的resourceType為資源類(lèi)型,表示是Servlet還是RPC、API網(wǎng)關(guān)、數據庫等??梢?jiàn),Sentinel還支持對數據庫的訪(fǎng)問(wèn)限流、熔斷。??

Sentinel提供的??熔斷降級功能,不僅可以在客戶(hù)端使用,也可以在服務(wù)端使用,但一般會(huì )放在客戶(hù)端,用于流量類(lèi)型為OUT類(lèi)型的(╯°□°)╯資源的熔斷降級,保證自身不受服務(wù)端的影響,不被服務(wù)端拖垮。

判斷Sentinel的熔斷降級功能是否支持在服務(wù)端執行,我們可通過(guò)閱讀Degrad(T_T)eSlot的源碼,查看是否限制了只有流量類(lèi)型為EntryType.OUT時(shí)才生效。

當DegradeSlot的entry方法被調用時(shí),由DegradeSlot調用DegradeRuleManager的chec??kDegrade(′▽?zhuān)?)方法檢查當前(′▽?zhuān)?)請求是否滿(mǎn)足ヽ(′▽?zhuān)?ノ某個(gè)熔斷降級規則。

在學(xué)習如何使用Sentinel實(shí)現熔斷降級時(shí),我們是使用DegradeRuleManager加載我們配置的熔斷降級規則的,所以Degrade??Slot將check邏輯才交給Degrade(?Д?)RuleManager去完成。

DegradeRuleManager首先根據資源名稱(chēng)獲取配置的熔斷降級規則??,因為我們可以對??同一個(gè)資源配置多個(gè)熔斷降級規則,所以返回的將是一個(gè)集合。然后遍歷熔斷降級規則,調用DegradeRule的passCheck方法將檢查是否需要觸發(fā)熔斷的邏輯交給DegradeRule完成。如果對一個(gè)資源配??置多個(gè)熔斷降級規則,那么只要有一個(gè)熔斷降級規則滿(mǎn)足條(tiao)件,就會(huì )觸發(fā)熔斷。

DegradeRule的passCheck方法源碼如下。

從DegradeRule的passCheck方法的源碼中,我們并未發(fā)現有任何地方限制熔斷降級的觸發(fā)只有流量類(lèi)型為EntryType.OUT才生效,因此,熔斷降級不僅可以用于客戶(hù)端,也可以用于服務(wù)??端。

熔斷降級策略支持三種:

1、平均響應時(shí)間 (DEGRADE_GRADE_RT)

2、異常比例 (DEGRADE_GRADヽ(′?`)ノE_EXCEPTION_RATIO)

3、異常數 (DEGRADE_GRADE_EXCEPTION(°o°)_COU(′?`)NT)。

官方文檔在介紹DEGRADE_GRADE_EXCEPTION_COUNT策略的地方加了使用注意說(shuō)明:注意由于統計時(shí)間窗口是??分鐘級別的,若 timeWindow 小于 60s,則結束熔斷狀態(tài)后仍可能再進(jìn)入熔斷狀態(tài)。

這句話(huà)并不難理解,從DegradeRule的pas??sCheck方法源碼就能找到答案,如下圖所示。

本文轉載自微信公(gong)眾號「 Java藝術(shù)」,可以通過(guò)以下二維碼關(guān)注。轉載本文請聯(lián)系 Java藝術(shù)公眾號。

亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费 北安市| 张家口市| 普格县| 祁连县| 曲松县| 蓬溪县| 南郑县| 屯昌县| 章丘市| 宝鸡市| 十堰市| 长阳| 新安县| 拉萨市| 上虞市| 潮安县| 饶阳县| 泉州市| 永兴县| 酒泉市| 肃宁县| 永修县| 兰考县| 临澧县| 西乡县| 临夏县| 临泽县| 疏附县| 定日县| 大竹县| 荔浦县| 淮阳县| 蒙城县| 浑源县| 禄丰县| 嘉禾县| 新沂市| 和硕县| 东安县| 凤城市| 旺苍县| http://444 http://444 http://444 http://444 http://444 http://444