sentinel是乙個功能全面的、面向分布式服務架構的輕量級高可用流量控制項,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助使用者保護服務的穩定性。下面說一下它的工作原理及使用方法
sentinel工作原理
當sentinel作用在呼叫的介面上時,會將這個介面抽象成一種資源,呼叫方需要申請這種資源,使用的方法是sphu.entry(),如果能夠申請成功,則說明沒有被限流,否則會丟擲blockexception,表面已經被限流了。
從sphu.entry()方法往下執行會進入到sph.entry(),在entry中,會為每一次申請建立乙個context,這個context就是記錄本次請求的上下文,然後還會為每一種資源建立一組插槽,這一組插槽就是責任鏈模式,每乙個插槽實現乙個功能,請求會進行插槽乙個乙個執行,這些插槽主要有以下幾個:
nodeselectorslot 負責收集資源的路徑,並將這些資源的呼叫路徑,以樹狀結構儲存起來,用於根據呼叫路徑來限流降級;
clusterbuilderslot 則用於儲存資源的統計資訊以及呼叫者資訊,例如該資源的 rt, qps, thread count 等等,這些資訊將用作為多維度限流,降級的依據;
statistcslot 則用於記錄,統計不同緯度的 runtime 資訊,流量統計作用;
flowslot 則用於根據預設的限流規則,以及前面 slot 統計的狀態,來進行限流;
authorizationslot 則根據黑白名單,來做黑白名單控制;
degradeslot 則通過統計資訊,以及預設的規則,來做熔斷降級;
systemslot 則通過系統的狀態,例如 load1 等,來控制總的入口流量;
其中,clusterbuilderslot會為每一種資源申請乙個全域性的clusternode,這個clusternode會在statistcslot中記錄每個執行緒對這個介面的呼叫情況(呼叫總數、成功次數、失敗次數等)。statistcslot採用的是滑動視窗統計方法,它有兩個重要的引數:windowlength(視窗長度), intervalinsec(時間間隔)。如視窗長度為500ms,時間間隔是1s,這樣系統就會申請兩個視窗,然後計算當前時間戳為time,進一步確定落在哪個視窗,具體邏輯如下:
long timeid = time / windowlength;
//計算在視窗陣列中的索引
int idx = (int)(timeid % array.length());
// 計算這個時間戳在對應視窗的開始時間
long time = time - time % windowlength;
while (true) else
} else if (time == old.windowstart()) else if (time > old.windowstart()) finally
} else
} else if (time < old.windowstart())
}
可見通過時間視窗,就可以將一次請求對應到乙個視窗,進而計算單位時間的流量,進行流控,同時熔斷降級也是通過計算單位時間的異常來實現的,所以時間視窗是十分核心的模組。隨著統計的不斷進行,當乙個視窗時間小於當前時間時,會被系統從當前視窗陣列中移除,放入到乙個list中,本地會啟動乙個定時任務,週期性的將list中的視窗資料重新整理到本地檔案中。當dashboard傳送獲取統計資料的請求後,本地就會返回檔案中的資料給dashboard,這樣使用者就可以看到統計資料。
sentinel的使用
目前使用sentinel主要用4種方式。
1、在**中直接使用
在**中直接呼叫函式sphu.entry(),由於這種方式是直接入侵**,所以不推薦
2、通過註解新增
在呼叫的介面上面新增註解@sentinelresource,這樣當呼叫該介面時,spring會通過aop的方式對含有sentinelresource註解的介面進行增強,採用環繞通知@around進行切片捕捉,在執行目標方法前執行sphu.entry()。這是一種比較好的方法,但是不適合大規模配置,如果介面眾多,乙個乙個新增註解很麻煩。
3、在filter中新增
目前我們專案中呼叫介面時,通過filter時,會獲取呼叫介面的名稱,讓好通過名稱為資源命名,這樣每個介面就是一種資源,這樣想到於在每個介面上執行sphu.entry(),這樣就實現了對每個介面對流量監控
4、在dashboard中新增配置
本地**中加入sentinel的包,相當與client。在伺服器上部署了dashboard,可以通過在dashboard中的配置頁面來實現sentinel配置的新增。本地的sentinel通過zk來監聽最新的配置訊息,當配置修改時,zk通過主動推送的方式將配置訊息傳送給client。
sentinel集群實現
sentinel中限流、熔斷降級可以在本地進行,也可以幾個例項組成乙個集群來統一控制。在集群模式中,乙個例項做service,其餘做client,通過netty進行socket通訊。client端遇到流量統計、流控、熔斷降級都是傳送請求到service,由service統一進行流量統計、流控、熔斷降級的處理。client的服務發現通過dashboard的動態配置來完成。
sentinel本地與dashboard通訊
總結
sentinel的功能強大,使用簡單,可幫助大家快速搭建線上監控系統。
流控神器 Sentinel 工作原理
sentinel 是面向分布式服務架構的輕量級流量控制框架,主要以流量為切入點,從流量控制 熔斷降級 系統負載保護等多個維度來幫助您保護服務的穩定性。1.sentinel資源 規則 我們說的資源,可以是任何東西,服務,服務裡的方法,甚至是一段 使用 sentinel 來進行資源保護,主要分為兩個步驟...
sentinel限流中介軟體原理
sentinel 專門為這種場景提供了勻速器的特性,可以把突然到來的大量請求以勻速的形式均攤,以固定的間隔時間讓請求通過,以穩定的速度逐步處理這些請求,起到 削峰填谷 的效果,從而避免流量突刺造成系統負載過高。同時堆積的請求將會排隊,逐步進行處理 當請求排隊預計超過最大超時時長的時候則直接拒絕,而不...
RFID簡介及工作原理
rfid的工作原理 射頻識別系統的基本模型如圖8 1所示。其中,電子標籤又稱為射頻標籤 應答器 資料載體 閱讀器又稱為讀出裝置,掃瞄器 通訊器 讀寫器 取決於電子標籤是否可以無線改寫資料 電子標籤與閱讀器之間通過耦合元件實現射頻訊號的空間 無接觸 耦合 在耦合通道內,根據時序關係,實現能量的傳遞 資...