日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

限流神器Sentinel,不了解一下吗?

發(fā)布時間:2025/3/16 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 限流神器Sentinel,不了解一下吗? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Sentinel 是啥?

分布式系統(tǒng)的流量防衛(wèi)兵

引用一下之前我畫的圖:

image.png

流量防衛(wèi)兵 它具備了哪些能力?

image.png

Sentinel 的生態(tài)環(huán)境

隨著 Alibaba 的 Java 生態(tài)建設(shè),包括 Spring Cloud Alibaba,Rocket,Nacos等多項開源技術(shù)的貢獻,目前Sentinel 對分布式的各種應(yīng)用場景都有了良好的支持和適配,這也是為什么我們選擇 Sentinel 學(xué)習(xí)的原因之一(學(xué)習(xí)成本低,應(yīng)用場景多)

image.png

Sentinel 核心概念

1、資源

資源 是 Sentinel 中的核心概念之一。最常用的資源是我們代碼中的 Java 方法,一段代碼,或者一個接口。

Java方法:

@SentinelResource("HelloWorld") public?void?helloWorld()?{//?資源中的邏輯System.out.println("hello?world"); }

一段代碼:

????????//?1.5.0?版本開始可以直接利用?try-with-resources?特性,自動?exit?entry try?(Entry?entry?=?SphU.entry("HelloWorld"))?{//?被保護的邏輯System.out.println("hello?world");}?catch?(BlockException?ex)?{//?處理被流控的邏輯System.out.println("blocked!");}

一個接口:

@RestController public?class?TestController?{@GetMapping("/test")public?String?test(){return?"test";} }

配合控制臺使用:

image.png

2、規(guī)則

Sentinel 中的規(guī)則 提供給用戶,針對不同的場景而制定不同的保護動作,規(guī)則的類型包括:

  • 流量控制規(guī)則

  • 熔斷降級規(guī)則

  • 系統(tǒng)保護規(guī)則

  • 來源訪問控制規(guī)則

  • 熱點參數(shù)規(guī)則

本文主要會講解 流量,熔斷 和系統(tǒng)保護這三個規(guī)則。

定義規(guī)則:

????private?static?void?initFlowRules(){List<FlowRule>?rules?=?new?ArrayList<>();FlowRule?rule?=?new?FlowRule();//綁定資源rule.setResource("HelloWorld");//限流閾值類型rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//數(shù)量級別rule.setCount(20);//添加到本地內(nèi)存rules.add(rule);FlowRuleManager.loadRules(rules);}

限流規(guī)則重要屬性說明:

?

Sentinel 限流

1、單機限流

1.1、引入依賴

在上一篇文章中,有提到過 RateLimiter ?實現(xiàn)的單機限流, 這里介紹一下,使用 Sentinel 實現(xiàn)的單機限流

//項目中引入?sentinel-core?依賴 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.1</version> </dependency>

1.2、定義限流規(guī)則

定義保護規(guī)則:

????private?static?void?initFlowRules(){List<FlowRule>?rules?=?new?ArrayList<>();FlowRule?rule?=?new?FlowRule();//綁定資源rule.setResource("HelloWorld");//限流閾值類型rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//數(shù)量級別rule.setCount(20);//添加到本地內(nèi)存rules.add(rule);FlowRuleManager.loadRules(rules);}

1.3、定義限流資源

根據(jù)上面描述的 資源劃分, 我們這里主要將 代碼塊 ?定義為資源。

public?static?void?main(String[]?args)?{//?配置規(guī)則.initFlowRules();while?(true)?{//?1.5.0?版本開始可以直接利用?try-with-resources?特性,自動?exit?entrytry?(Entry?entry?=?SphU.entry("HelloWorld"))?{//?被保護的邏輯System.out.println("hello?world");}?catch?(BlockException?ex)?{//?處理被流控的邏輯System.out.println("blocked!");}} }

1.4、運行結(jié)果

Demo 運行之后,我們可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的輸出:

image.png???csp?cat?com-jaycekon-sentinel-demo-FlowRuleDemo-metrics.log.2021-07-03|--timestamp-|------date?time----|-resource-|p?|block|s?|e|rt 1625294582000|2021-07-03?14:43:02|HelloWorld|20|1720|20|0|2|0|0|0 1625294583000|2021-07-03?14:43:03|HelloWorld|20|5072|20|0|0|0|0|0 1625294584000|2021-07-03?14:43:04|HelloWorld|20|6925|20|0|0|0|0|0
  • p 代表通過的請求

  • block 代表被阻止的請求

  • s 代表成功執(zhí)行完成的請求個數(shù)

  • e 代表用戶自定義的異常

  • rt 代表平均響應(yīng)時長

Sentinel 的單機限流 ,和 RateLimiter 有什么區(qū)別呢?

附錄:《Sentinel - 滑動窗口實現(xiàn)原理》

2、控制臺限流

2.1、客戶端接入控制臺

超詳細文檔,參考:《Sentinel - 控制臺》

Sentinel 提供一個輕量級的開源控制臺,它提供機器發(fā)現(xiàn)以及健康情況管理、監(jiān)控(單機和集群),規(guī)則管理和推送的功能。

下載Jar 包(21M),或者下載源碼(4M) 后自行進行編譯(不建議,編譯花的時間比直接下載jar包還要久)

https://github.com/alibaba/Sentinel/releases

編譯后,啟動命令

java?-Dserver.port=8000?-Dcsp.sentinel.dashboard.server=localhost:8000?-Dproject.name=sentinel-dashboard?-jar?sentinel-dashboard-1.8.1.jar

進入控制臺

image.png

2.2、引入依賴

客戶端需要引入 Transport 模塊來與 Sentinel 控制臺進行通信。您可以通過 pom.xml 引入 JAR 包

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.1</version> </dependency>//重要的依賴,還是提前先寫上吧,避免小伙伴找不到了 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId><version>1.8.1</version> </dependency>

然后!!!煩了我一下午的地方來了!!在官方文檔中,指出了需要引入對應(yīng)的依賴配置 , 好家伙,那么重要的話,你如此輕描淡寫,腦殼疼啊!!!

image.png

對應(yīng)的適配依賴有

  • 云原生微服務(wù)體系

  • Web 適配

  • RPC 適配

  • HTTP client 適配

  • Reactive 適配

  • Reactive 適配

  • Apache RocketMQ

好家伙,基本上所有業(yè)務(wù)場景都覆蓋到了!由于我的Demo 項目是基于 SpringBoot ,然后想看看 云原生微服務(wù)體系下的視頻,好家伙,要用 SpringCloud , 想要了解的,可以參考: ?《Spring-Cloud-Sentinel》

2.3、定義資源

@SpringBootApplication @Configuration @RestController public?class?SpringBootSentinelApplication?{public?static?void?main(String[]?args)?{SpringApplication.run(SpringBootSentinelApplication.class,?args);}@Beanpublic?FilterRegistrationBean?sentinelFilterRegistration()?{FilterRegistrationBean<Filter>?registration?=?new?FilterRegistrationBean<>();registration.setFilter(new?CommonFilter());registration.addUrlPatterns("/*");registration.setName("sentinelFilter");registration.setOrder(1);return?registration;}@RequestMapping("/index")public?String?index(){return?"hello?index";}}

在概述中,我們有提到過,需要被保護的資源,可以是 一個代碼塊,一個方法或者一個接口。這里通過 Filter 的 方式,將所有請求都定義為資源 (/*), 那么我們在請求的過程就會變成這樣子:

image.png

2.4 運行結(jié)果

添加啟動參數(shù)

-Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=jaycekon-sentinel

參數(shù)說明:

  • server.port : 服務(wù)啟動端口

  • csp.sentinel.dashboard.server : 狀態(tài)上報機器ip:端口

  • project.name : 監(jiān)控項目名稱

image.png

運行結(jié)果:

2.5 限流配置

image.png

流控效果

  • 1、快速失敗:直接失敗

  • 2、Warm Up:預(yù)熱模式,根據(jù)codeFactory的值(默認3),從閾值/codeFactory,經(jīng)過預(yù)熱時長,才達到設(shè)置的QPS閾值。比如設(shè)置QPS為90,設(shè)置預(yù)熱為10秒,則最初的閾值為90/3=30,經(jīng)過10秒后才達到90。

  • 3、排隊等待:比如設(shè)置閾值為10,超時時間為500毫秒,當(dāng)?shù)?1個請求到的時候,不會直接報錯,而是等待500毫秒,如果之后閾值還是超過10,則才會被限流。

運行結(jié)果:

image.pngimage.png

3、集群限流

講了那么多,終于要到核心的 集群限流方案了, 在秒殺系統(tǒng)設(shè)計中,我們談到很多場景都是以單機作為具體案例進行分析,如果我們的系統(tǒng)要擴容,那么如何做好限流方案。假設(shè)集群中有 10 臺機器,我們給每臺機器設(shè)置單機限流閾值為10 QPS,理想情況下整個集群的限流閾值就為100 QPS。不過實際情況下流量到每臺機器可能會不均勻,會導(dǎo)致總量沒有到的情況下某些機器就開始限流。因此僅靠單機維度去限制的話會無法精確地限制總體流量。而集群流控可以精確地控制整個集群的調(diào)用總量,結(jié)合單機限流兜底,可以更好地發(fā)揮流量控制的效果。

介紹一下集群限流的核心角色:

  • Token Client:集群流控客戶端,用于向所屬 Token Server 通信請求 token。集群限流服務(wù)端會返回給客戶端結(jié)果,決定是否限流。

  • Token Server:即集群流控服務(wù)端,處理來自 Token Client 的請求,根據(jù)配置的集群規(guī)則判斷是否應(yīng)該發(fā)放 token(是否允許通過)。

在嵌入模式下的結(jié)構(gòu)圖:

image.png

在獨立模式下的結(jié)構(gòu)圖:

image.png

內(nèi)嵌模式,即 發(fā)Token 的操作,有其中某一個實例完成,其他 Client 通過向 Server 請求,獲取訪問許可。

獨立模式,即作為獨立的 token server 進程啟動,獨立部署,隔離性好,但是需要額外的部署操作。

3.1、阿里云AHAS

在上述示例代碼中,使用了本地模式的 Demo, 在集群限流的場景,這里用一下 阿里云提供的 AHAS 服務(wù)。

控制臺地址:https://ahas.console.aliyun.com/index?ns=default&region=public

引入依賴:

//sentinel?ahas?依賴,包括了sentinel的使用依賴 <dependency><groupId>com.alibaba.csp</groupId><artifactId>ahas-sentinel-client</artifactId><version>1.8.8</version> </dependency>

這里有個要注意的點, AHAS 的依賴,包含了 Sentinel ,所需要使用到的依賴,包括 sentinel-core,sentinel-web-servlet和sentinel-transport-simple-http。

否則會出現(xiàn) Spi 異常 , 如果對 Spi 不太了解,建議加群提問,嘿嘿~

com.alibaba.csp.sentinel.spi.SpiLoaderException

image.pngimage.png

3.2、開啟阿里云AHAS 服務(wù)

這里有官方的開通文檔,我就不贅述了,文檔地址

在應(yīng)用防護這里找到 Lincense ,然后添加啟動參數(shù):

-Dserver.port=8092 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d -Dcsp.sentinel.log.use.pid=true

image.png

由于我們要本地啟動多實例, 因此需要修改服務(wù)的多個端口:

java?-Dserver.port=8090?-Dproject.name=jaycekon-sentinel?-Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d??-Dcsp.sentinel.log.use.pid=true?-jar?sentinel-ahas-0.0.1-SNAPSHOT.jarjava?-Dserver.port=8091?-Dproject.name=jaycekon-sentinel?-Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d??-Dcsp.sentinel.log.use.pid=true?-jar?sentinel-ahas-0.0.1-SNAPSHOT.jarjava?-Dserver.port=8092?-Dproject.name=jaycekon-sentinel?-Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d??-Dcsp.sentinel.log.use.pid=true?-jar?sentinel-ahas-0.0.1-SNAPSHOT.jar

產(chǎn)生訪問流量后,可以在大盤看到機器的鏈接狀態(tài):

http://localhost:8092/index

image.png

3.3、集群流控規(guī)則配置

image.png

這里有個兩個概念:

  • 集群閥值:指的是,我們集群總體能通過的訪問量,可能存在分配不均的情況(能避免單機誤限)。

  • 退化單機:當(dāng) Token Server 訪問超時,即無法從遠端獲取令牌時,回退到單機限流

測試限流, 只訪問 http://localhost:8092/index

通過手刷(手速過硬~),觸碰到限流的臨界值,然后整體限流跟我們預(yù)期一致。

image.png

退化單機

在集群流控這里,有個 Token 請求超時時間,Client 請求 Server ,然后返回數(shù)據(jù)結(jié)果。整個流程會有網(wǎng)絡(luò)請求的耗時,在上面的測試流程中,我將超時時間調(diào)大了,每次請求都能拿到Token, 通過修改請求超時時間,觸發(fā)退化 單機限流 。

image.png

運行結(jié)果:

image.png

3.4、Server 角色轉(zhuǎn)換

在內(nèi)嵌模式下,通過 HTTP API的方式,將角色轉(zhuǎn)換為 Server 或 client

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server,-1 代表關(guān)閉。注意應(yīng)用端需要引入集群限流客戶端或服務(wù)端的相應(yīng)依賴。

在獨立模式下,我們可以直接創(chuàng)建對應(yīng)的 ClusterTokenServer 實例并在 main 函數(shù)中通過 start 方法啟動 Token Server。

?

Sentinel 熔斷

在秒殺系統(tǒng) 的案例中,一個完整的鏈路可能包含了 下訂單,支付 和物流對接等多個服務(wù)(實際上不止那么少)。在一個完整的鏈路中,各個系統(tǒng)通過 rpc/http的形式進行交互,在下面的鏈路圖中,如果用戶選擇的 支付方式,存在延時過高,服務(wù)不穩(wěn)定,或服務(wù)異常等情況,會導(dǎo)致整個鏈路沒辦法完成。最終的結(jié)果就是,用戶明明搶到了,但是沒辦法支付,導(dǎo)致訂單丟失。

image.png

現(xiàn)代微服務(wù)架構(gòu)都是分布式的,由非常多的服務(wù)組成。不同服務(wù)之間相互調(diào)用,組成復(fù)雜的調(diào)用鏈路。以上的問題在鏈路調(diào)用中會產(chǎn)生放大的效果。復(fù)雜鏈路上的某一環(huán)不穩(wěn)定,就可能會層層級聯(lián),最終導(dǎo)致整個鏈路都不可用。因此我們需要對不穩(wěn)定的弱依賴服務(wù)調(diào)用進行熔斷降級,暫時切斷不穩(wěn)定調(diào)用,避免局部不穩(wěn)定因素導(dǎo)致整體的雪崩。熔斷降級作為保護自身的手段,通常在客戶端(調(diào)用端)進行配置。

1、熔斷降級

添加測試代碼

????@RequestMapping("/myError")public?String?error(){if?(true){throw?new?RuntimeException("sentinel?run?error");}return?"error";}

降級保護效果:

用戶通過訪問接口 /myError , 出現(xiàn)一次異常后,在接下來的10秒 ,都會走降級策略,直接返回。能夠很好的保護服務(wù)端避免異常過多,占用機器資源。同時快速響應(yīng)用戶請求。

2、熔斷策略

Sentinel 提供以下幾種熔斷策略:

  • 慢調(diào)用比例 (SLOW_REQUEST_RATIO):選擇以慢調(diào)用比例作為閾值,需要設(shè)置允許的慢調(diào)用 RT(即最大的響應(yīng)時間),請求的響應(yīng)時間大于該值則統(tǒng)計為慢調(diào)用。當(dāng)單位統(tǒng)計時長(statIntervalMs)內(nèi)請求數(shù)目大于設(shè)置的最小請求數(shù)目,并且慢調(diào)用的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求響應(yīng)時間小于設(shè)置的慢調(diào)用 RT 則結(jié)束熔斷,若大于設(shè)置的慢調(diào)用 RT 則會再次被熔斷。

  • 異常比例 (ERROR_RATIO):當(dāng)單位統(tǒng)計時長(statIntervalMs)內(nèi)請求數(shù)目大于設(shè)置的最小請求數(shù)目,并且異常的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結(jié)束熔斷,否則會再次被熔斷。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。

  • 異常數(shù) (ERROR_COUNT):當(dāng)單位統(tǒng)計時長內(nèi)的異常數(shù)目超過閾值之后會自動進行熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結(jié)束熔斷,否則會再次被熔斷。

?

總結(jié)

本文主要詳細講解了一下 如何通過 Sentinel 去實際接觸 限流和熔斷,對于限流的底層實現(xiàn),后續(xù)會有專門的源碼分析篇。對于熔斷,本文也沒有細說個究竟,下一篇文章會給大家?guī)?#xff0c;熔斷是什么,在系統(tǒng)中到底是怎么實際使用,以及常見的熔斷策略。

項目源碼地址:https://github.com/jaycekon/SpringBoot
歡迎? Star? 和 Fork?

有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號

好文章,我在看??

總結(jié)

以上是生活随笔為你收集整理的限流神器Sentinel,不了解一下吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。