天天看點

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

簡介

Sentinel提供了豐富的限流、熔斷功能。它支援控制台配置限流、熔斷規則,支援叢集限流,并可以将相應服務調用情況可視化。

目前已經有很多項目接入了Sentinel,而本文主要是對Sentinel的限流功能做一次詳細的分析。

Sentinel會進行流量統計,執行流量控制規則。而統計資料的展示和規則的設定在 sentinel-dashboard 項目中,這是一個 Spring MVC 應用,有背景管理界面,我們通過這個管理背景和各個應用進行互動。

當然,你不一定需要 dashboard,僅僅使用 sentinel-core,它會将統計資訊寫入到指定的日志檔案中,通過該檔案内容來了解每個接口的流量情況。這時隻是使用到了 Sentinel 的流量監控功能。

dashboard 應用預設不持久化資料,它的所有資料都在記憶體,是以 dashboard 重新開機意味着所有資料都會丢失。你應按需要定制化 dashboard,如至少你應該要持久化規則設定,QPS 資料非常适合存放在時序資料庫中,當然如果你的資料量不大,存 MySQL 也問題不大,定期清理一下過期資料即可,因為大部分人應該不會關心一個月以前的 QPS。

Sentinel 的核心将不同 Slot 按序串在一起(責任鍊模式),進而将不同功能(限流、降級、系統保護)組合在一起。核心結構:

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

slot chain 其實可以分為兩部分:統計資料建構部分(statistic)和判斷部分(rule checking)。

Sentinel 的資料統計

資料統計子產品的内容,這樣讀者在後面看到相應的内容的時候心裡有一些底。這節内容還是比較簡單的,當然,如果你希望立馬進入 Sentinel 的主流程,可以先跳過這一節。

Sentinel 的定位是流量控制,它有兩個次元的控制,一個是控制并發線程數,另一個是控制 QPS,它們都是針對某個具體的接口來設定的,其實說資源比較準确,Sentinel 把控制的粒度定義為 Resource。

要做控制,首先就要先做統計,它要知道目前接口的 QPS 和并發是多少,進而判斷一個新的請求能不能讓它通過。

資料統計的代碼在

StatisticNode

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

QPS 資料使用了滑動視窗:

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

儲存最近60秒的統計資訊。 windowLengthInMs 故意設定為1000毫秒,表示每秒每個桶,這樣我們就可以獲得每秒的準确統計資訊。

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

線程數量的計數器,即統計并發量

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

可知,Sentinel 統計了 秒 和 分 兩個次元,現在看其實作類

ArrayMetric

Sentinel中的基本度量标準類,使用内部 BucketLeapArray。

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

屬性

以分鐘次元統計的使用來說,使用子類 BucketLeapArray 實作。

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric

構造器

阿裡 Sentinel 源碼解析(上)簡介Sentinel 的資料統計StatisticNodeArrayMetric