SpringCloud中使用Sentinel實現(xiàn)限流的實戰(zhàn)
前言
在分布式的項目中經常會遇到那種高并發(fā)的場景,為了保證系統(tǒng)不會被突然激增的請求導致宕機,我們常常會使用一種服務降級的手段來保護我們的系統(tǒng),本篇博客將介紹如何使用SpringCloud
中使用Sentinel
實現(xiàn)限流,從而達到服務降級的目的。
正文 Sentinel
Sentinel 是面向微服務的輕量級流量控制框架,從流量控制、熔斷降級、系統(tǒng)負載保護等多個維度保護服務的穩(wěn)定性。
Sentinel可以作為Hystrix
的替代品,為系統(tǒng)提供服務熔斷和服務降級的功能。
- 服務熔斷:根據保險絲的熔斷是一個原理,當調用目標服務大量超時和失敗,這時候應該熔斷掉該服務的調用,從而快速釋放資源,這段時間所有對其調用都是快速返回,保證整體服務系統(tǒng)的穩(wěn)定
- 服務降級:針對核心業(yè)務服務的壓力劇增,根據當前業(yè)務場景和流量對其他非核心服務進行降級處理,可以進行限流,快速返回等處理,釋放資源保證核心任務的正常運行。
Sentinel的限流原理
Sentinel
以Bucket
(桶)為單位記錄一個時間窗口內的請求總數、異??倲怠⒖偤臅r等指標數據。- 而一個
Bucket
可以是記錄一秒內的數據,也可以是10毫秒內的數據,我們稱這個時間窗口為Bucket
的統(tǒng)計單位,由使用者自定義。
所以Sentinel
是基于滑動窗口算法來實現(xiàn)的。
設置Sentinel的閾值指標:
線程數模式
線程數的模式采用信號隔離的方式來防止線程池被占用。
用于防止線程池被占用,一般有兩種方式:
- 線程池隔離:為應對太多線程占用的情況,業(yè)內有使用隔離的方案,比如通過不同業(yè)務邏輯使用不同線程池來隔離業(yè)務自身之間的資源爭搶,這種隔離方案雖然隔離性比較好,但是代價就是線程數目太多,線程上下文切換的
overhead
比較大,特別是對低延時的調用有比較大的影響。 - 信號隔離:
sentinel
采用的是信號隔離的方案,簡單統(tǒng)計當前請求上下文的線程數目(正在執(zhí)行的調用數目),如果超出閾值,新的請求會被立即拒絕。
所以業(yè)務處理是多線程的情況下使用線程數模式。
Sentinel
采用信號隔離的方式,通過并發(fā)線程數模式,并結合基于響應時間的熔斷降級模式,可以在不穩(wěn)定的平均相應時間比較高的時候自動降級,防止過多的慢調用占滿并發(fā)數,影響整個系統(tǒng),避免慢調用引起依賴雪崩的現(xiàn)象。
QPS模式QPS
即每秒查詢率,是對一個特定的查詢服務器在規(guī)定時間內所處理流量多少的衡量標準。QPS
模式適合單讀線程情況(如servlet
請求),這種模式下提供了三種更加精確的流控方式:
- 直接拒絕 :直接失敗
- Warm Up: 即請求
QPS
從threshold / 3
開始,經預熱時長逐漸升至設定的QPS
閾值,通常用于秒殺系統(tǒng)。 - 勻速排隊:設置一個等待時間, 勻速處理請求,保證服務的均勻性,不能處理
QPS>1000
的場景。
Sentinel 兩種計算閾值的模式:
- 集群總體模式:即限制整個集群內的某個資源的總體
qps
不超過此閾值。 - 單機均攤模式:單機均攤模式下配置的閾值等同于單機能夠承受的限額,
token server
會根據連接數來計算總的閾值(比如獨立模式下有 3個client
連接到了token server
,然后配的單機均攤閾值為 10,則計算出的集群總量就為30),按照計算出的總的閾值來進行限制。這種方式根據當前的連接數實時計算總的閾值,對于機器經常進行變更的環(huán)境非常適合。
這里要說明的是:qps
是每秒查詢數, tps
是每秒內的事務數, pv
是指頁面被瀏覽的次數。
Sentinel流控模式
- 直接模式: 接口達到限流條件時,開啟限流
- 關聯(lián)模式: 當關聯(lián)的資源達到限流條件時,開啟限流
- 鏈路模式:當從某個接口過來的資源達到限流條件時,開啟限流
Sentinel限流的方式
- 在
Sentinel
控制臺中根據url
進行限流設置 - 通過注解的方式進行自定義限流,又可以分為:自定義
url
限流和自定義資源限流。
第一步:部署sentinel-dashboard
sentinel-dashboard(點擊下載jar
包)是一個單獨的應用,通過spring-boot
進行啟動,主要提供一個輕量級的控制臺,它提供機器發(fā)現(xiàn)、單機資源實時監(jiān)控、集群資源匯總,以及規(guī)則管理的功能。
這里可以理解為sentinel
服務治理中心。
java -Dserver.port=18080 -jar sentinel-dashboard.jar
第二步:在項目中整合sentinel
注入依賴
<!--springCloud-Alibaba--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--sentinel限流--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.1.RELEASE</version> </dependency>
在application.properties中的相關配置
spring.application.name=imagerepair server.port=8080 spring.cloud.sentinel.transport.dashboard=127.0.0.1:18080 spring.cloud.sentinel.eager=true
Controller層
@RestController public class UserController { @Autowired UserService userService; @RequestMapping("/hello") public String hello(){ return userService.sayHello(); } }
Service
@Service public class UserService { @SentinelResource(value = "sayHello",fallback = "sayHellofail") public String sayHello(){ return "Hello,World"; } public String sayHellofail(){ return "I'am sorry"; } }
設置限流,快速訪問,從而觸發(fā)服務降級
設置Sentinel的資源
當請求超過設定的閾值,啟動限流降級,展示如下:
項目源碼
該項目源碼可從我的github中獲取。
到此這篇關于SpringCloud中使用Sentinel實現(xiàn)限流的實戰(zhàn)的文章就介紹到這了,更多相關SpringCloud Sentinel限流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java Scanner的使用和hasNextXXX()的用法說明
這篇文章主要介紹了Java Scanner的使用和hasNextXXX()的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10springboot+vue實現(xiàn)阿里云oss上傳的示例代碼
文件上傳是常用的功能,本文主要介紹了springboot+vue實現(xiàn)阿里云oss上傳的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06SpringBoot實現(xiàn)yml配置文件為變量賦值
這篇文章主要介紹了SpringBoot實現(xiàn)yml配置文件為變量賦值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02