阿里Sentinel源碼解析責任鏈模式的應用
? 點擊上方“JavaEdge”,關注公眾號

NodeSelectorSlot


NodeSelectorSlot:鏈中處理的第一個節(jié)點
責任鏈實例和 resource name 相關,和線程無關,所以當處理同一個resource 時,會進入同一 NodeSelectorSlot 實例。
所以該節(jié)點代碼主要處理:不同的 context name,同一 resource name 的場景。
如下它們都處理同一 resource(“getUserInfo” resource),但它們入口 context 不一。
結合前面的那棵樹,可得如下樹
清楚 NodeSelectorSlot 實例和 resource 一一對應即可。

ClusterBuilderSlot

主要創(chuàng)建 ClusterNode
該類處理后
每個 resource 對應一個 ClusterNode 實例,若不存在,就創(chuàng)建一個新實例。
統(tǒng)計意義

數(shù)據(jù)統(tǒng)計的。比如?getUserInfo?接口,由于從不同的?context name?開啟調用鏈,它有多個 DefaultNode 實例,但只有一個?ClusterNode,通過該實例,即可知道該接口的 QPS。
此類還處理了 origin 不是默認值場景:
origin 代表調用方標識,如 application-a, application-b。
當設置了 origin,會生成一個 StatisticsNode 實例,掛在 ClusterNode。
改下案例代碼
getUserInfo 接收到來自 application-a 和 application-b 兩個應用的請求,那么樹會變成下面這樣:
它的作用是用來統(tǒng)計從 application-a 過來的訪問 getUserInfo 這個接口的信息。目前該信息在 dashboard 不展示,畢竟沒啥用。

LogSlot

直接 fire 出去了,即先處理責任鏈后面的節(jié)點,若它們拋 BlockException,才處理。

StatisticSlot

作用

數(shù)據(jù)統(tǒng)計。
原理

先 fire,等后面的節(jié)點處理完畢后,再進行統(tǒng)計數(shù)據(jù)。
為何這樣設計?
因為后面節(jié)點是做控制,執(zhí)行時可能正常通過,也可能拋 BlockException。
QPS 統(tǒng)計
使用滑動窗口線程并發(fā)的統(tǒng)計
使用 LongAdder
接下來幾個 Slot 需要通過 dashboard 進行開啟,因為需要配置規(guī)則。
也可以硬編碼規(guī)則到代碼中。但是要調整數(shù)值就比較麻煩,每次都要改代碼。
往期推薦

目前交流群已有?800+人,旨在促進技術交流,可關注公眾號添加筆者微信邀請進群
喜歡文章,點個“在看、點贊、分享”素質三連支持一下~

