Sentinel流控規(guī)則實(shí)現(xiàn)限流保護(hù)詳解
具體啟動(dòng)Sentinel的步驟可以參考我的上一篇文章。
概念
資源名:唯一名稱(chēng),默認(rèn)請(qǐng)求路徑
針對(duì)來(lái)源:Sentinel可以針對(duì)調(diào)用者進(jìn)行限流,填寫(xiě)微服務(wù)名,默認(rèn)default (不區(qū)分來(lái)源)
閱值類(lèi)型單機(jī)閱值:
QPS(每秒鐘的請(qǐng)求數(shù)量):當(dāng)調(diào)用該api的QPS達(dá)到值的時(shí)候,進(jìn)行限流
線程數(shù):當(dāng)調(diào)用該api的線程數(shù)達(dá)到闊值的時(shí)候,進(jìn)行限流
是否集群:不需要集群
流控模式:
直接:api達(dá)到限流條件時(shí),直接限流
關(guān)聯(lián):當(dāng)關(guān)聯(lián)的資源達(dá)到聞值時(shí),就限流自己
鏈路:只記錄指定鏈路上的流量(指定資源從入口資源進(jìn)來(lái)的流量,如果達(dá)到闊值,就進(jìn)行限流)[api級(jí)別的針對(duì)來(lái)源]
流控效果:
快速失?。褐苯邮?,拋異常
Warm Up(預(yù)熱):根據(jù)codeFactor (冷加載因子,默認(rèn)3) 的值,從聞值/codeFactor,經(jīng)過(guò)預(yù)熱時(shí)長(zhǎng),才達(dá)到設(shè)置的QPS閩值
排隊(duì)等待:勻速排隊(duì),讓請(qǐng)求以勻速的速度通過(guò),闊值類(lèi)型必須設(shè)置為QPS,否則無(wú)效
流控規(guī)則
直接(默認(rèn))
控制層方法如下:
@RestController
public class SentinelController {
@GetMapping("/testA")
public String testA(){
return "Sentinel testA run";
}
@GetMapping("/testB")
public String testB(){
return "Sentinel testB run";
}
}
QPS+快速失敗

通過(guò)地址欄輸入:localhost:8401/testA
測(cè)試發(fā)現(xiàn)當(dāng)每秒刷新頁(yè)面的次數(shù)大于1則會(huì)彈出以下頁(yè)面(表示限流),否則正常

線程數(shù)+直接控制
而直接控制的線程數(shù)設(shè)置為1表示如果超過(guò)一個(gè)頁(yè)面訪問(wèn)此連接那就會(huì)限流否則正常。這里就不再對(duì)線程數(shù)做測(cè)試了
QPS+Warming up
Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即預(yù)熱/冷啟動(dòng)方式。當(dāng)系統(tǒng)流量長(zhǎng)期處于低水位的情況下,當(dāng)流量突然增加時(shí),直接把系統(tǒng)拉升到高水位可能瞬間把系統(tǒng)壓垮。通過(guò)"冷啟動(dòng)",讓通過(guò)的流量緩慢增加,在一定時(shí)間內(nèi)逐漸增加到閾值上限,給冷系統(tǒng)一個(gè)預(yù)熱的時(shí)間,避免冷系統(tǒng)被壓垮。
舉例:當(dāng)預(yù)熱時(shí)長(zhǎng)=8,QPS單機(jī)閾值=3
- 當(dāng)并發(fā)請(qǐng)求到達(dá)的時(shí)候,實(shí)際的單機(jī)閾值是:QPS單機(jī)閾值配置 / coldFactoer= 3 / 3 =1,也就是每秒鐘只能一個(gè)請(qǐng)求訪問(wèn)成功。
- 預(yù)熱時(shí)長(zhǎng)為8秒,實(shí)際的單機(jī)閾值在8秒鐘內(nèi)逐步由1 -> 2 -> 3,最終等于QPS單機(jī)閾值配置。
- 這里有一個(gè)注意點(diǎn)是QPS單機(jī)閾值一定要大于或等于3否則會(huì)一直請(qǐng)求不成功

QPS+排隊(duì)等待
排隊(duì)等待方式會(huì)嚴(yán)格的控制請(qǐng)求通過(guò)的間隔時(shí)間,就是讓請(qǐng)求勻速的通過(guò),對(duì)應(yīng)的是漏桶算法。

言簡(jiǎn)意賅:QPS對(duì)應(yīng)每秒處理的線程為1,超時(shí)時(shí)間表示超過(guò)10s則不接受其他線程的請(qǐng)求。也就是說(shuō)將超時(shí)時(shí)間(ms) / 單機(jī)閾值(s/個(gè)) = 線程通過(guò)數(shù)。

關(guān)聯(lián)
使用了testA關(guān)聯(lián)testB那么當(dāng)二者其一越界了即二者其一或者觸犯了閾值規(guī)則,那么規(guī)則的時(shí)長(zhǎng)內(nèi)即QPS內(nèi)testA是無(wú)法訪問(wèn)的,換句通俗易懂的就是:其中一個(gè)犯錯(cuò),testA就得扛鍋。但要注意的是不是永久失效,只是閾值內(nèi)失效。

鏈路
與關(guān)聯(lián)相反。兩者之一犯錯(cuò),那么就是入口資源背鍋。

關(guān)聯(lián)與鏈路的區(qū)別
關(guān)聯(lián):
配置: “查詢訂單” 關(guān)聯(lián) “下單” 接口, 當(dāng)"下單"到達(dá)閾值, 限流"查詢訂單"接口
鏈路:
配置: “查詢訂單”為入口時(shí), 當(dāng)"查詢訂單"到達(dá)閾值時(shí), 限流"查詢訂單"
到此這篇關(guān)于Sentinel流控規(guī)則實(shí)現(xiàn)限流保護(hù)流程詳解的文章就介紹到這了,更多相關(guān)Sentinel流控規(guī)則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(19)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
Java多線程之定時(shí)器Timer的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java多線程中定時(shí)器Timer類(lèi)的使用以及模擬實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
Java線程創(chuàng)建靜態(tài)代理模式代碼實(shí)例
這篇文章主要介紹了Java線程創(chuàng)建靜態(tài)代理模式代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Spring實(shí)現(xiàn)自定義注解處理器解析和處理注解
這篇文章主要介紹了Spring實(shí)現(xiàn)自定義注解處理器解析和處理注解,注解在現(xiàn)代Java編程中扮演了至關(guān)重要的角色,無(wú)論是簡(jiǎn)化代碼、增強(qiáng)可讀性,還是將元數(shù)據(jù)與業(yè)務(wù)邏輯分離,注解都讓我們的代碼更加優(yōu)雅和靈活,需要的朋友可以參考下2024-10-10
使用ResponseEntity處理API返回問(wèn)題
這篇文章主要介紹了使用ResponseEntity處理API返回問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
淺談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談java+內(nèi)存分配及變量存儲(chǔ)位置的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
java多線程中的生產(chǎn)者和消費(fèi)者隊(duì)列詳解
這篇文章主要介紹了java多線程中的生產(chǎn)者和消費(fèi)者隊(duì)列詳解,隊(duì)列,是一種數(shù)據(jù)結(jié)構(gòu),除了優(yōu)先級(jí)隊(duì)列和LIFO隊(duì)列外,隊(duì)列都是以FIFO(先進(jìn)先出)的方式對(duì)各個(gè)元素進(jìn)行排序的,需要的朋友可以參考下2024-01-01
獲取Java的MyBatis框架項(xiàng)目中的SqlSession的方法
SqlSession中包括已經(jīng)映射好的SQL語(yǔ)句,這樣對(duì)象實(shí)例就可以直接拿過(guò)來(lái)用了,那么這里就來(lái)講解獲取Java的MyBatis框架項(xiàng)目中的SqlSession的方法2016-06-06

