Spring?Cloud中Sentinel的兩種限流模式介紹
Sentinel流控模式
Sentinel流量控制主要有以下幾種模式:
直接失敗模式:在達(dá)到流量控制閾值后,直接拒絕請求,返回錯(cuò)誤信息。
關(guān)聯(lián)模式:當(dāng)關(guān)聯(lián)的資源達(dá)到流量控制閾值時(shí),將觸發(fā)當(dāng)前資源的流量控制。
Warm Up模式:在系統(tǒng)啟動(dòng)時(shí),允許一定量的請求通過,防止出現(xiàn)系統(tǒng)冷啟動(dòng)時(shí)大量請求被拒絕的情況。
排隊(duì)等待模式:在達(dá)到流量控制閾值后,請求將進(jìn)入隊(duì)列等待,直到有資源可用時(shí)再處理請求。
熱點(diǎn)規(guī)則:對于一些熱點(diǎn)資源,可以設(shè)置特定的流量控制規(guī)則,以防止熱點(diǎn)資源被過多請求占用導(dǎo)致系統(tǒng)崩潰。
說明:由于篇幅原因,本篇文章先介紹前兩種模式,即直接失敗模式和關(guān)聯(lián)模式。
直接失敗模式
Sentinel的直接失敗模式是一種流量控制策略,它可以在系統(tǒng)達(dá)到預(yù)設(shè)的流量閾值時(shí)直接拒絕請求,而不是將請求放入隊(duì)列等待處理。該模式可以避免系統(tǒng)資源過度消耗,并且可以快速響應(yīng)請求,提高系統(tǒng)的可用性。
具體來說,Sentinel的直接失敗模式可以通過以下步驟實(shí)現(xiàn):
1.配置流量閾值:在Sentinel中,可以通過配置規(guī)則來設(shè)置系統(tǒng)的流量閾值,例如:每秒最多處理100個(gè)請求。
2.監(jiān)控流量:Sentinel會(huì)監(jiān)控系統(tǒng)的流量,當(dāng)流量達(dá)到預(yù)設(shè)的閾值時(shí),Sentinel會(huì)觸發(fā)流量控制策略。
3.直接拒絕請求:在直接失敗模式下,當(dāng)流量達(dá)到閾值時(shí),Sentinel會(huì)直接拒絕請求,并返回錯(cuò)誤信息給客戶端,而不是將請求放入隊(duì)列等待處理。
4.統(tǒng)計(jì)流量:Sentinel會(huì)統(tǒng)計(jì)系統(tǒng)的流量情況,并根據(jù)配置的規(guī)則進(jìn)行限流,以保證系統(tǒng)的穩(wěn)定性和可用性。
首先,我們需要添加Sentinel依賴:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
然后,在啟動(dòng)類上添加@EnableSentinel注解啟用Sentinel:
@SpringBootApplication @EnableSentinel public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
接下來,我們定義一個(gè)Controller,其中包含一個(gè)需要進(jìn)行流量控制的方法:
@RestController public class DemoController { @GetMapping("/hello") @SentinelResource(value = "hello", fallback = "fallback") public String hello() { return "Hello, World!"; } public String fallback() { return "Sorry, the service is busy, please try again later."; } }
在上面的代碼中,我們使用@SentinelResource注解標(biāo)記了hello()方法,并指定了一個(gè)fallback方法。當(dāng)Sentinel進(jìn)行流量控制并觸發(fā)熔斷時(shí),會(huì)自動(dòng)調(diào)用fallback方法返回一個(gè)固定的響應(yīng)。
接下來,我們需要在Sentinel Dashboard中配置流量控制規(guī)則。打開Dashboard,進(jìn)入流控規(guī)則頁面,添加一個(gè)新的規(guī)則,將控制臺模式設(shè)置為直接失敗,并設(shè)置閾值和時(shí)間窗口等參數(shù)。保存規(guī)則后,我們就可以開始測試了。
當(dāng)流量超過閾值時(shí),Sentinel會(huì)拒絕請求并返回一個(gè)固定的響應(yīng),即fallback方法中定義的響應(yīng)。這就是Sentinel的直接失敗模式。
關(guān)聯(lián)模式
Sentinel的關(guān)聯(lián)模式是一種流量控制策略,它可以根據(jù)不同的資源之間的關(guān)聯(lián)關(guān)系來進(jìn)行流量控制。比如,如果一個(gè)接口的訪問頻率過高,可能會(huì)導(dǎo)致其所依賴的其他接口也受到影響,此時(shí)就可以使用關(guān)聯(lián)模式來控制流量。
關(guān)聯(lián)模式的實(shí)現(xiàn)需要定義資源之間的關(guān)聯(lián)關(guān)系,并為每個(gè)資源設(shè)置獨(dú)立的流控規(guī)則。在實(shí)際使用中,可以通過配置文件或代碼來定義關(guān)聯(lián)關(guān)系和流控規(guī)則。
以下是一個(gè)使用代碼實(shí)現(xiàn)Sentinel關(guān)聯(lián)模式的示例:
// 定義資源關(guān)聯(lián)關(guān)系 private static final String RESOURCE_A = "resourceA"; private static final String RESOURCE_B = "resourceB"; private static final String RESOURCE_C = "resourceC"; // 定義流控規(guī)則 private static final FlowRule RULE_A = new FlowRule(RESOURCE_A) .setCount(10) // 每秒最多處理10個(gè)請求 .setGrade(RuleConstant.FLOW_GRADE_QPS); private static final FlowRule RULE_B = new FlowRule(RESOURCE_B) .setCount(20) // 每秒最多處理20個(gè)請求 .setGrade(RuleConstant.FLOW_GRADE_QPS); private static final FlowRule RULE_C = new FlowRule(RESOURCE_C) .setCount(30) // 每秒最多處理30個(gè)請求 .setGrade(RuleConstant.FLOW_GRADE_QPS); // 定義資源關(guān)聯(lián)關(guān)系 private static final Set<FlowRule> RULES_A = new HashSet<>(); private static final Set<FlowRule> RULES_B = new HashSet<>(); private static final Set<FlowRule> RULES_C = new HashSet<>(); static { RULES_A.add(RULE_A); RULES_A.add(RULE_B); RULES_B.add(RULE_B); RULES_C.add(RULE_C); } // 注冊流控規(guī)則 FlowRuleManager.loadRules(RULES_A); FlowRuleManager.loadRules(RULES_B); FlowRuleManager.loadRules(RULES_C); // 定義資源關(guān)聯(lián)關(guān)系 DegradeRule degradeRuleA = new DegradeRule(RESOURCE_A) .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) .setCount(5) // 每秒最多處理5個(gè)異常 .setTimeWindow(10); // 統(tǒng)計(jì)時(shí)間窗口為10秒 DegradeRule degradeRuleB = new DegradeRule(RESOURCE_B) .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) .setCount(10) // 每秒最多處理10個(gè)異常 .setTimeWindow(10); // 統(tǒng)計(jì)時(shí)間窗口為10秒 DegradeRule degradeRuleC = new DegradeRule(RESOURCE_C) .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) .setCount(15) // 每秒最多處理15個(gè)異常 .setTimeWindow(10); // 統(tǒng)計(jì)時(shí)間窗口為10秒 // 定義資源關(guān)聯(lián)關(guān)系 private static final Set<DegradeRule> DEGRADE_RULES_A = new HashSet<>(); private static final Set<DegradeRule> DEGRADE_RULES_B = new HashSet<>(); private static final Set<DegradeRule> DEGRADE_RULES_C = new HashSet<>(); static { DEGRADE_RULES_A.add(degradeRuleA); DEGRADE_RULES_A.add(degradeRuleB); DEGRADE_RULES_B.add(degradeRuleB); DEGRADE_RULES_C.add(degradeRuleC); } // 注冊降級規(guī)則 DegradeRuleManager.loadRules(DEGRADE_RULES_A); DegradeRuleManager.loadRules(DEGRADE_RULES_B); DegradeRuleManager.loadRules(DEGRADE_RULES_C);
在上面的代碼中,我們定義了三個(gè)資源:RESOURCE_A、RESOURCE_B、RESOURCE_C,并為每個(gè)資源設(shè)置了獨(dú)立的流控規(guī)則和降級規(guī)則。同時(shí),我們還定義了資源之間的關(guān)聯(lián)關(guān)系,即RESOURCE_A和RESOURCE_B關(guān)聯(lián),RESOURCE_B和RESOURCE_C關(guān)聯(lián)。
通過這種方式,當(dāng)RESOURCE_A的流量達(dá)到限制時(shí),Sentinel會(huì)自動(dòng)觸發(fā)降級操作,從而避免RESOURCE_B和RESOURCE_C受到影響。同樣地,當(dāng)RESOURCE_B的流量達(dá)到限制時(shí),Sentinel會(huì)自動(dòng)觸發(fā)降級操作,從而避免RESOURCE_C受到影響。
到此這篇關(guān)于Spring Cloud中Sentinel的兩種限流模式介紹的文章就介紹到這了,更多相關(guān)Spring Cloud Sentinel限流模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在SpringBoot項(xiàng)目中使用Spring Cloud Sentinel實(shí)現(xiàn)流量控制
- SpringCloud?集成Sentinel的實(shí)戰(zhàn)教程
- Spring?Cloud?中使用?Sentinel?實(shí)現(xiàn)服務(wù)限流的兩種方式
- springcloud3 Sentinel的搭建及案例操作方法
- Spring?Cloud微服務(wù)架構(gòu)Sentinel數(shù)據(jù)雙向同步
- Spring?Cloud?Alibaba微服務(wù)組件Sentinel實(shí)現(xiàn)熔斷限流
- Spring?Cloud?Gateway整合sentinel?實(shí)現(xiàn)流控熔斷的問題
- Java之SpringCloudAlibaba Sentinel組件案例講解
- Sentinel 斷路器在Spring Cloud使用詳解
相關(guān)文章
Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題
這篇文章主要介紹了Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java雜談之類和對象 封裝 構(gòu)造方法以及代碼塊詳解
在現(xiàn)實(shí)世界中,真實(shí)存在的東西,比如吉普車,卡丁車,貨車。我們在認(rèn)識它的時(shí)候就會(huì)在腦海中將它抽象為一種類別叫做車。 好了,那再計(jì)算機(jī)世界中,它同樣的也會(huì)這樣做2021-09-09Java實(shí)現(xiàn)CSV格式轉(zhuǎn)對象
csv全稱“Comma-Separated Values”,是一種逗號分隔值格式的文件,常用來存儲(chǔ)數(shù)據(jù)的純文本格式文件。本文將用Java語言實(shí)現(xiàn)CSV轉(zhuǎn)對象,需要的可以參考一下2022-06-06spring 整合 mybatis 中數(shù)據(jù)源的幾種配置方式(總結(jié)篇)
因?yàn)閟pring 整合mybatis的過程中, 有好幾種整合方式,尤其是數(shù)據(jù)源那塊,經(jīng)??吹讲灰粯拥呐渲梅绞?,總感覺有點(diǎn)亂,所以今天有空總結(jié)下,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05SpringBoot設(shè)置默認(rèn)主頁的方法步驟
這篇文章主要介紹了SpringBoot設(shè)置默認(rèn)主頁的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12SpringBoot配置MyBatis-Plus實(shí)現(xiàn)增刪查改
本文主要介紹了SpringBoot配置MyBatis-Plus實(shí)現(xiàn)增刪查改,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示
這篇文章主要介紹了Java使用設(shè)計(jì)模式中的代理模式構(gòu)建項(xiàng)目的實(shí)例展示,代理模式中的代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用,需要的朋友可以參考下2016-05-05Spring項(xiàng)目運(yùn)行依賴spring-contex解析
這篇文章主要介紹了Spring項(xiàng)目運(yùn)行依賴spring-contex解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05