Sentinel(二):Sentinel流量控制

一、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條。

? ? ? ?如下圖所示:

? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ?

? ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

支持PY普冉系列單片機調試工具PY32linK仿真器

PY32 Link是專為 ?PY32系列ARM-Cortex內核單片機?(如PY32F002A/030/071/040/403等)設計的仿真器,支持全系列芯片的?調試和仿真?功能。?開發環境兼容性?支持主流IDE:?Keil MDK? 和 ?IAR Embedded Workbench?,…

深入解析Python多服務器監控告警系統:從原理到生產部署

深入解析Python多服務器監控告警系統:從原理到生產部署 整體架構圖 核心設計思想 無代理監控:通過SSH直接獲取數據,無需在目標服務器安裝代理故障隔離:單臺服務器故障不影響整體監控多級檢測:網絡層→資源層→服務層層…

JUC:10.線程、monitor管程、鎖對象之間在synchronized加鎖的流程(未完)

一、monitor管程工作原理: 首先,synchronized是一個對象鎖,當線程運行到某個臨界區,這個臨界區使用synchronized對對象obj進行了上鎖,此時底層發生了什么? 1.當synchronized對obj上鎖后,synch…

Elasticsearch(ES)分頁

Elasticsearch(簡稱 ES)本身不適合傳統意義上的“深分頁”,但提供了多種分頁方式,每種適用不同場景。我們來詳細講解: 一、基本分頁(from size) 最常用的分頁方式,類似 SQL 的 LIM…

原生微信小程序:用 `setData` 正確修改數組中的對象項狀態(附實戰技巧)

📌 背景介紹 在微信小程序開發中,我們經常需要修改數組中某個對象的某個字段,比如: 列表中的某一項展開/收起多選狀態切換數據列表中的臨時標記等 一個常見的場景是: lists: [{ show: true }, { show: true }, { s…

Oracle 臨時表空間相關操作

一、臨時表空間概述 臨時表空間(Temporary Tablespace)是Oracle數據庫中用于存儲臨時數據的特殊存儲區域,其數據在會話結束或事務提交后自動清除,重啟數據庫后徹底消失。主要用途包括: 存儲排序操作(如OR…

從靜態到動態:Web渲染模式的演進和突破

渲染模式有好多種,了解下web的各種渲染模式,對技術選型有很大的參考作用。 一、靜態HTML時代 早期(1990 - 1995年)網頁開發完全依賴手工編寫HTML(HyperText Markup Language)和CSS(層疊樣式表…

Flask(六) 數據庫操作SQLAlchemy

文章目錄 一、準備工作二、最小化可運行示例? 補充延遲綁定方式(推薦方式) 三、數據庫基本操作(增刪改查)1. 插入數據(增)2. 查詢數據(查)3. 更新數據(改)4.…

PYTHON從入門到實踐7-獲取用戶輸入與while循環

# 【1】獲取用戶輸入 # 【2】python數據類型的轉換 input_res input("請輸入一個數字\n") if int(input_res) % 10 0:print("你輸入的數是10的倍數") else:print("你輸入的數不是10的倍數") # 【3】while循環,適合不知道循環多少次…

學習筆記(C++篇)—— Day 8

1.STL簡介 STL(standard template libaray-標準模板庫):是C標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架。 2.STL的六大組件 先這樣,下一部分是string的內容,內容比較多&a…

ant+Jmeter+jenkins接口自動化,如何實現把執行失敗的接口信息單獨發郵件?

B站講的最好的自動化測試教程,工具框架附項目實戰一套速通,零基礎完全輕松掌握!自動化測試課程、web/app/接口 實現AntJMeterJenkins接口自動化失敗接口郵件通知方案 要實現只發送執行失敗的接口信息郵件通知,可以通過以下步驟實…

惡意Python包“psslib“實施拼寫錯誤攻擊,可強制關閉Windows系統

Socket威脅研究團隊發現一個名為psslib的惡意Python包,該軟件包偽裝成提供密碼安全功能,實則會突然關閉Windows系統。這個由化名umaraq的威脅行為者開發的軟件包,是對知名密碼哈希工具庫passlib的拼寫錯誤仿冒(typosquatting&…

云原生灰度方案對比:服務網格灰度(Istio ) 與 K8s Ingress 灰度(Nginx Ingress )

服務網格灰度與 Kubernetes Ingress 灰度是云原生環境下兩種主流的灰度發布方案,它們在架構定位、實現方式和適用場景上存在顯著差異。以下從多個維度對比分析,并給出選型建議: 一、核心區別對比 維度服務網格灰度(以 Istio 為例…

科技如何影響我們的生活?

科技已成為我們生活中不可或缺的一部分,徹底改變了我們工作、溝通和生活的方式。從智能手機到智能家居,科技已滲透到我們生活的每個角落。無論是用手機鬧鐘開啟新的一天,通過 Alexa 開關燈光,還是打開 Uber 或 Lyft 打車上班&…

Re--攻防世界-基礎android

Jadx 可以看到有賬號密碼輸入 進入checkPassword函數 分析一下: 對每個字符 pass[len] 進行以下計算 pass[len] (char) (((255 - len) - 100) - pass[len]); 解密腳本 def decrypt_password(): password [] for len in range(12): c (255 - le…

InnoDB表空間結構-系統表空間

系統表空間整體結構 頁號為7的SYS類型頁結構

如何構建知識庫

構建個人知識庫是一個系統化的過程,需要結合工具選擇、信息管理和持續優化。以下是分步驟的實用指南,包含現代工具和方法的建議: 一、明確知識庫定位(Why) ?核心目標? 學習型:支持學術研究/職業發展&…

3 大語言模型預訓練數據-3.2 數據處理-3.2.2 冗余去除——2.SimHash算法文本去重實戰案例:新聞文章去重場景

SimHash算法文本去重實戰案例:新聞文章去重場景 一、案例背景與目標二、具體實現步驟與示例1. **待去重文本示例**2. **步驟1:文本預處理與特征提取**3. **步驟2:特征向量化與哈希映射**4. **步驟3:特征向量聚合**5. **步驟4&…

MSPM0G3507之GPIO配置報錯 #Sysconfig報錯

聲明:本文完全免費閱讀,如果你發現某天文章被設置了“VIP權限”,請私信我解除(非筆者所為)。 一、問題現象 在打開sysconfig后,GPIO這里會報錯。 Unable to render selection Error:launchPadShortcut:Vali…

2025年檢測相機十大品牌測評:工業級精度與場景化解決方案解析

一、引言 在工業自動化與智能制造領域,檢測相機作為質量管控的核心硬件,正以“高精度、高速度、高適應性”的特性重塑生產流程。這類設備通過光學成像與智能算法結合,實現對工件表面缺陷、尺寸偏差、裝配精度的精準檢測,效率較傳…