一、Sentinel 流控規則基本介紹
1、Snetinel 流控規則配置方式
? ? ? ?Sentinel 支持可視化的流控規則配置,使用非常簡單;可以在監控服務下的“簇點鏈路” 或
? ? ? ?“流控規則” 中 給指定的請求資源配置流控規則;一般推薦在?“簇點鏈路” 中配置流控規則。
? ? ? ? 如下圖所示:
? ? ? ? ? ? ?1)在 “簇點鏈路” 中配置流控規則
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ?2)在 “流控規則” 中配置流控規則
? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?
? ? ? ?
2、流控規則名詞解析
? ? ?1)資源名:唯一名稱,默認請求路徑
? ? ?2)針對來源:Sentinel可以針對調用者進行限流,填寫微服務名,默認default(不區分來源)
? ? ?3)閾值類型:
? ? ? ? ? QPS:每秒鐘的請求數量,當調用該API的QPS達到閾值的時候,進行限流
? ? ? ? ? 并發請求數:每秒調用請求的線程數量,當調用該API的線程數量達到閾值的時候,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?進行限流
? ? ?4)單機閾值:指每秒調用當前資源的次數
? ? ?5)是否集群:當前不需要集群,先不測試集群
? ? ?6)流控模式:
? ? ? ? ? ?I)直接:API達到限流條件時,直接限流
? ? ? ? ? ?II)關聯:當關聯的資源達到閾值時,就限流自己
? ? ? ? ? ?III)鏈路:只記錄指定鏈路上的流量(指定資源從入口資源進來的流量,如果達到閾值,
? ? ? ? ? ? ? ? ? ? ? ? ? ? 就進行限流)(API級別的針對來源)
? ? ?7)流控效果:
? ? ? ? ? ?I)直接失敗:直接失敗,拋出異常
? ? ? ? ? ?II)Wam Up:根據codeFactor(冷加載因子,默認3)的值,從“閾值/codeFacotor” 開始,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 經過預熱時長,才達到設置的QPS閾值
? ? ? ? ? ?III)排隊等待:勻速排隊,讓請求以勻速的速度通過,閾值類型必須設置為QPS,否則無效
二、具體的流控規則配置練習
1、準備環境
? ? ?創建服務(sentinel-8401),并整合Sentinel(具體步驟請參考上一篇“整合Sentinel”);
? ? 在?sentinel-8401,創建controller類?FlowlimitController,定義2個資源 “/testA”、“/testB”;
? ? 如下所示:
@RestController
public class FlowlimitController {@GetMapping("/testA")public String testA() {return "testA------測試";}@GetMapping("/testB")public String testB(){return "testB------測試";}}
1、直接
1.1、QPS(閾值類型)+直接(流控模式)
? ? ? ? ?給請求testA配置流控,閾值類型選擇 “QPS”,單機閾值配置為 1,流控模式選擇“直接”,
? ? ? ? ?流控效果選擇“直接失敗”表示當請求/testA每秒請求數超過1時,請求直接失敗;
? ? ? ? ?如下圖所示:
? ? ? ? ? ? ? ?
? ? ? ?然后在瀏覽器或PostMan 中快速訪問 “/testA”,當達到限流上限后的請求直接返回異常,
? ? ? ?如下所示:
? ? ? ? ? ??
? ? ? ? ?流控模式為 “直接” 、流控效果為“直接”失敗的方式很簡單,就測試一種情況就行了
2、關聯
? ? ? 官方解釋:當關聯的資源達到閾值時,就限流自己。
? ? ??通俗解釋來說,比如那我們的程序,現在有testA接口和testB接口,當A關聯的資源B達到
? ? ? 閾值后,就限流自己,也就是B到達閾值,限流A本身,B本身不會被限流。
? ? ?換到程序里面來說比如一個電商系統中,支付系統達到閾值,就限流下訂單系統。
? ? ?如下圖所示:
? ? ? ? ? ??
2.1、“關聯”使用步驟
? ? ? ? ?1)準備2個請求資源“testA接口和testB接口”,如下所示:
@RestController
public class FlowlimitController {@GetMapping("/testA")public String testA() {return "testA------測試";}@GetMapping("/testB")public String testB(){return "testB------測試";}
}
? ? ? ? ?2)給請求資源 “testA” 添加流控規則,testA 關聯 testB,并配置testB的QPS為1
? ? ? ? ? ? ? 如下所示:
? ? ? ? ? ? ? ? ? ?
? ? ? ? ?3)測試
? ? ? ? ? ? ? ?先在瀏覽器或postman訪問testB,達到限流上限,然后再訪問testA,
? ? ? ? ? ? ? ?testA 也會被限流,直接返回失敗;
? ? ? ? ? ? ? ?注意:此時testB并沒有被限流,testB還能正常訪問
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ??
? ? ? ? ? ? ??
? ? ? ? ? ? ? ?
3、鏈路
? ? ??鏈路流控模式指的是,當從某個接口過來的資源達到限流條件時,開啟限流,它的功能有
? ? ? 點類似于“針對來源”配置項,區別在于:針對來源是針對上級微服務,而鏈路流控是針對
? ? ? 上級接口,也就是說它的粒度更細。
? ? ? ?比如在一個微服務中,兩個接口都調用了同一個Service中的方法,并且該方法用
? ? ? ?SentinelResource(用于定義資源)注解標注了,然后對該注解標注的資源(方法)進
? ? ? ?行配置,則可以選擇鏈路模式。如下圖所示:
? ? ? ? ? ? ??
? ? ? ? 此時若訪問testA時史資源 common 達到了限流上限,再訪問testA時會直接拋出異常
? ? ? (testA被限流了),但此時testB 正常訪問,testB沒有被限流。
3.2、測試步驟
? ? ? ? ?1)準備service接口common
public interface SentinelService {String common();
}/***************************************************** 測試 Sentinel 流控規則--鏈路* 鏈路流控模式指的是,當從某個接口過來的資源達到限流條件時,開啟限流,它的功能有點類似于針對來源配置項,* 與來源項的區別在于:來源項針對來源是針對上級微服務,而鏈路流控是針對上級接口,也就是說它的粒度更細。* 比如在一個微服務中,兩個接口都調用了同一個Service中的方法,并且該方法用SentinelResource(用于定義資源)注解標注了,* 然后對該注解標注的資源(方法)進行配置,則可以選擇鏈路模式。** @author * @date 2025/6/23 10:29****************************************************/
@Service
public class SentinelServiceImpl implements SentinelService {/*** 注解 @SentinelResource 指定需要限流的資源(方法)* @return*/@SentinelResource("common")@Overridepublic String common() {return "common";}
}
? ? ? ? ?2)修改FlowlimitController 中的testA 與testB 方法,并調用方法common
@RestController
public class FlowlimitController {@Autowiredprivate SentinelService sentinelService;@GetMapping("/testA")public String testA() {return sentinelService.common();}@GetMapping("/testB")public String testB(){return sentinelService.common();}
}
? ? ? ? ?3)給testA 鏈路中的方法資源common 配置流控規則,如下所示:
? ? ? ? ? ? ? ?
? ? ? ? ?4)修改配置文件application.yml,在Sentinel 配置中添加配置項web-context-unify=false;
? ? ? ? ? ? ? ?將 CommonFilter 中的參數 WEB_CONTEXT_UNIFY 設置為false,即可根據不同的URL
? ? ? ? ? ? ? ? 開啟限流,否則不生效,配置內容如下:
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? 5)測試結果:
? ? ? ? ? ? ? ??
三、具體流控效果配置練習
1、Wam Up
? ? ?Warm Up方式,即預熱/冷啟動方式。
? ? ?該方式主要用于系統長期處于低水位的情況下,當流量突然增加時,直接把系統拉升到高水位
? ? ?可能瞬間把系統壓垮。通過"冷啟動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值
? ? ?上限,給冷系統一個預熱的時間,避免冷系統被壓垮的情況。
? ? ?預熱公式:預熱時間 = 閾值/coldFactor(coldFactor:冷加載因子,默認值為3);
? ? ? 經過預熱時間后才會達到閾值,即啟動的過程系統允許通過的QPS不會瞬間到達閾值,
? ? ? 會慢慢的上升到QPS閾值,
? ? ? 冷啟動的過程系統允許通過的QPS曲線如下圖:
? ? ? ? ? ? ?
? ? ? 使用場景:一般秒殺系統中會有這樣的流控設置,為了防止秒殺瞬間造成系統崩潰。
1.1、Wam Up使用示例
? ? ? ? ?默認冷加載因子coldFactor為3,當發起請求即請求QPS從(閾值/3)開始(即第一次請求的
? ? ? ? ?初始化閾值= 當前閾值/coldFactor),經過指定預熱時長才逐步升至設定的QPS閾值,
? ? ? ? ?如:當前閾值設置為10,預熱時長設置為5秒,那么系統 初始化時閾值 = 當前閾值10/3
? ? ? ? ? ? ? ? 約等于3,即閾值在此時為3,經過5秒后閾值才慢慢升高到10
? ? ? ? ?流控規則配置如下:
? ? ? ? ? ? ? ??
? ? ? ? ?測試:
? ? ? ? ? ?直接在瀏覽器上手動刷新,然后我們來看Sentinel的實時監控中QPS的變化,
? ? ? ? ? ?如下圖所示:
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? 通過Sentinel的實時監控的圖中請求QPS的變化可以發現若每秒的QPS大于
? ? ? ? ? ? ? 初始化閾值(當前閾值/coldFactor),那么多于的請求會被拒絕,在瀏覽器中也可以
? ? ? ? ? ? ? 發現有請求返回:Blocked by Sentinel (flow limiting)
? ? ? ? ? ? ? 如下圖所示:
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ?
2、排隊等待
2.1、概念
? ? ? ? ?排隊等待方式會嚴格控制請求通過的間隔時間,也即是讓請求以均勻的速度通過,對應
? ? ? ? ?的是漏桶算法。
? ? ? ? ?這種方式主要用于處理間隔性突發的流量,例如消息隊列。想象一下這樣的場景,在某一秒
? ? ? ? 有大量的請求到來,而接下來的幾秒則處于空閑狀態,我們希望系統能夠在接下來的空閑期
? ? ? ? 間逐漸處理這些請求,而不是在第一秒直接拒絕多余的請求(削峰填谷)。如下圖所示:
? ? ? ? ? ? ? ??
? ? ? ? 勻速器
? ? ? ? ? ? ? ??它的中心思想是,以固定的間隔時間讓請求通過。當請求到來的時候,如果當前請求距
? ? ? ? ? ? ? ? 離上個通過的請求通過的時間間隔不小于預設值,則讓當前請求通過。否則,計算當前
? ? ? ? ? ? ? ?請求的預期通過時間,如果該請求的預期通過時間小于規則預設的 timeout 時間,則該請
? ? ? ? ? ? ? ?求會等待直到預設時間到來通過(排隊等待處理);若預期的通過時間超出最大排隊時
? ? ? ? ? ? ? ?長,則直接拒接這個請求。如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ?Sentinel 勻速排隊等待策略是漏桶算法結合虛擬隊列等待機制實現的。
? ? ? ? ? ?注意:排隊等待(勻速排隊)模式暫時不支持 QPS > 1000 的場景。
2.2、示例
? ? ? ? 給請求“/testF” 配置 “排隊等待” 流控效果;配置QPS的單機閾值為1,表示1秒只處理一個
? ? ? ? 請求,超時時間(最大排隊時間)為2000(20秒,單位是毫秒);當1s內進來25個請求,
? ? ? ? 第一個請求會被立即處理,后續的請求被放到等待隊列中,隊列中的請求只要在超時時間
? ? ? ? 之內,都可以被處理,超過了超時時間就被直接拒絕了。流控規則配置如下:
? ? ? ? ? ? ? ?
? ? ? ? 注意:若想看到被拒絕的場景,可以把超時時間調小點,然后在瀏覽器中快速刷新請求;
? ? ? ? ? ? ? ? ? ?postman是每秒發送一次請求,測不出超時拒絕的場景
? ? ? ? 然后在FlowlimitController 類中的 testF 方法中打印一條輸出語句,如下圖所示:
? ? ? ? ? ? ? ?
? ? ? ? 最后我們可以通過Postman來進行測試,發送請求時沒有延遲,同時發送25條請求,
? ? ? ? 然后我們會發現就是排隊效果1秒執行一個請求,同時我們在Idea中也可以看到打印效果,
? ? ? ?也是1s輸出1條。
? ? ? ?如下圖所示:
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ?