原始碼分析 Alibaba sentinel 滑動視窗實現原理(文末附原理圖)
阿新 • • 發佈:2020-03-23
要實現限流、熔斷等功能,首先要解決的問題是如何實時採集服務(資源)呼叫資訊。例如將某一個介面設定的限流闊值 1W/tps,那首先如何判斷當前的 TPS 是多少?Alibaba Sentinel 採用滑動視窗來實現實時資料的統計。
> 溫馨提示:如果對原始碼不太感興趣,可以先跳到文末,看一下滑動視窗的設計原理圖,再決定是否需要閱讀原始碼。
@[TOC](本節目錄)
## 1、滑動視窗核心類圖
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191229144055643.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
我們先對上述核心類做一個簡單的介紹,重點關注核心類的作用與核心屬性(重點需要探究其核心資料結構)。
- Metric
指標收集核心介面,主要定義一個滑動視窗中成功的數量、異常數量、阻塞數量,TPS、響應時間等資料。
- ArrayMetric
滑動視窗核心實現類。
- LeapArray
滑動視窗頂層資料結構,包含一個一個的視窗資料。
- WindowWrap
每一個滑動視窗的包裝類,其內部的資料結構用 MetricBucket 表示。
- MetricBucket
指標桶,例如通過數量、阻塞數量、異常數量、成功數量、響應時間,已通過未來配額(搶佔下一個滑動視窗的數量)。
- MetricEvent
指標型別,例如通過數量、阻塞數量、異常數量、成功數量、響應時間等。
## 2、滑動視窗實現原理
#### 2.1 ArrayMetric
滑動視窗的入口類為 ArrayMetric ,我們先來看一下其核心程式碼。
~~~java
private final L