Sentinel基本概念

2021-09-27 12:30:28 字數 3435 閱讀 5390

sentinel是阿里開源的一款高效能的限流框架。這裡將對sentinel的使用和實現進行介紹。

這裡先介紹下sentinel中涉及到的基本概念,包括使用上或者實現上。主要是筆者在閱讀文件和原始碼時經常會接觸到的物件。

resource

node

節點是用來儲存統計資料的基本資料單元,node本身只是乙個介面,它有多個實現:

statisticnode 唯一的直接實現類,實現了流量統計的基本方法,在statisticslot中使用

clusternode 繼承自statisticnode,對於某乙個資源的全域性統計

defaultnode 繼承自statisticnode,對於某乙個資源在相應上下文中的實現,儲存了乙個指向clusternode的引用。另外還儲存了子節點列表,當在同乙個context下多次呼叫sphu.entry不同資源時會建立子節點

entrancenode 繼承自defaultnode,代表乙個呼叫的根節點,乙個context會對應到乙個entrancenode

context

上下文是用來儲存當前呼叫的元資料,儲存在threadlocal中,它包含了幾個資訊:

entrancenode 整個呼叫樹的根節點,即入口

entry 當前的呼叫點

node 關聯到當前呼叫點的統計資訊

origin 通常用來標識呼叫方,這在我們需要按照呼叫方來區分流控策略的時候會非常有用

每當我們呼叫sphu.entry()或者 spho.entry()獲取訪問資源許可的時候都需要當前執行緒處在某個context中,如果我們沒有顯式呼叫contextutil.enter(),缺省會使用default context。如果我們在乙個上下文中多次呼叫sphu.entry()來獲取多個資源,乙個呼叫樹就會被建立出來

nullcontext

超過系統能夠建立的最大會話數則返回nullcontext,後續不對該會話做過濾校驗,直接放過。

entry

每次sphu.entry()呼叫都會返回乙個entry,entry保持了所有關於當前資源呼叫的資訊:

createtime 這個資源呼叫的建立時間

currentnode sphu.entry請求進入的資源在當前上下文中的統計資料node

originnode sphu.entry請求進入的資源對於特定origin呼叫方的統計資料node

entry的實現類為ctentry,它其中除了上述資訊之外,還儲存了額外的資訊:

parent 呼叫樹鏈條中上乙個entry

child 呼叫樹鏈條中的下乙個entry

chain 當前呼叫資源所使用的限流工作責任鏈,包括各個slot

context 當前呼叫點所屬的上下文

entrytype

entrytype 說的是這次請求的流量型別,共有兩種型別:in 和 out 。

in:是指進入我們系統的入口流量,比如 http 請求或者是其他的 rpc 之類的請求。

out:是指我們系統呼叫其他第三方服務的出口流量。

入口、出口流量只有在配置了系統規則時才有效。

設定type 為 in 是為了統計整個系統的流量水平,防止系統被打垮,用以自我保護的一種方式。

設定type 為 out 一方面是為了保護第三方系統,比如我們系統依賴了乙個生成訂單號的介面,而這個介面是核心服務,如果我們的服務是非核心應用的話需要對他進行限流保護;另一方面也可以保護自己的系統,假設我們的服務是核心應用,而依賴的第三方應用老是超時,那這時可以通過設定依賴的服務的 rt 來進行降級,這樣就不至於讓第三方服務把我們的系統拖垮。

slot

entry 建立的時候,同時也會建立一系列功能插槽(slot chain),這些插槽有不同的職責,例如:

nodeselectorslot 負責收集資源的路徑,並將這些資源的呼叫路徑,以樹狀結構儲存起來,用於根據呼叫路徑來限流降級;

clusterbuilderslot 則用於儲存資源的統計資訊以及呼叫者資訊,例如該資源的 rt, qps,thread count 等等,這些資訊將用作為多維度限流,降級的依據;

logslot 用於列印日誌

statisticslot 則用於記錄、統計不同緯度的 runtime 指標監控資訊;

systemslot 則通過系統的狀態,例如 load1 等,來控制總的入口流量;

authorityslot 則根據配置的黑白名單和呼叫**資訊,來做黑白名單控制;

flowslot 則用於根據預設的限流規則以及前面 slot 統計的狀態,來進行流量控制;

degradeslot 則通過統計資訊以及預設的規則,來做熔斷降級;

slot只繫結在ctentry上

processorslotchain

功能槽處理鏈,entry進入乙個槽可以新增自己的動作,之後後fire動作會entry下乙個槽,exit同理

注意,實現上相同資源共享乙個processorslotchain ,可以跨context

default:表示不區分呼叫者,來自任何呼叫者的請求都將進行限流統計。如果這個資源名的呼叫總和超過了這條規則定義的閾值,則觸發限流。

:表示針對特定的呼叫者,只有來自這個呼叫者的請求才會進行流量控制。例如 nodea 配置了一條針對呼叫者caller1的規則,那麼當且僅當來自 caller1 對 nodea 的請求才會觸發流量控制。

other:表示針對除 以外的其餘呼叫方的流量進行流量控制。例如,資源nodea配置了一條針對呼叫者 caller1 的限流規則,同時又配置了一條呼叫者為 other 的規則,那麼任意來自非 caller1 對 nodea 的呼叫,都不能超過 other 這條規則定義的閾值。

同乙個資源名可以配置多條規則,規則的生效順序為: > other > default

介紹完了上面的基本概念,下面給出sentinel的基本用法:

listrules = new arraylist(); 

flowrule rule1 = new flowrule();

rule1.setresource(key);

// set limit qps to 20

rule1.setcount(20);

rule1.setgrade(ruleconstant.flow_grade_qps);

rules.add(rule1);

​entry entry = null;

​try catch (blockexception e1) catch (exception e2) finally

}​

如上,為sentinel的基本用法:

先設定好規則,在進入需要受保護的資源前,嘗試獲取token,若成功獲取token,則可以執行相關邏輯,否則丟擲異常進行處理,最後釋放所獲得的token 。

基本概念 C 基本概念

由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...

基本概念 數控系統基本概念

第一章 基本概念 數控工具機cnc是一種按事先編制好的加工零件程式進行加工的高效 自動化加工裝置。是 computer numerical control machine tools 的簡稱。數控工具機較好地解決了複雜 精密 小批量 多品種的零件加工問題,是一種柔性的 高效能的自動化工具機。西門子系...

XSLT基本概念

我們首先來澄清乙個概念,大家可能聽說過xsl extensible stylesheet language xsl和我們這裡說的xslt從狹義上理解是一樣的,而按照w3c的標準,xslt的說法更嚴格些,因此我們在文章中統一使用xslt的稱法。它們之間具體的關係我們會在下面講述。1.1 什麼是xslt...