sentinel簡介
Sentinel的官方標題是:分布式系統的流量防衛兵。從名字上來看,很容易就能猜到它是用來作服務穩定性保障的。對于服務穩定性保障組件,如果熟悉Spring Cloud的用戶,第一反應應該就是Hystrix。但是比較可惜的是Netflix已經宣布對Hystrix停止更新。那么,在未來我們還有什么更好的選擇呢?除了Spring Cloud官方推薦的resilience4j之外,目前Spring Cloud Alibaba下整合的Sentinel也是用戶可以重點考察和選型的目標。
Sentiner與hystrix的區別:
解決雪崩問題的常見方式:
- 1、超時處理:設定超時時間,請求超過一定的時間沒有響應就返回錯誤信息,不會無休止等待。
- 2、艙壁模式:限定每個業務能使用的線程數,避免耗盡整個tomcat資源,因此也叫線程隔離。
- 3、熔斷降級:有斷路器統計業務執行的異常比例,如果超出閾值則會熔斷業務,攔截訪問該業務的一切請求。
- 4、流量控制:限制業務訪問的QPS,避免服務因流量的突增而故障。
安裝并整合sentinel
Sentinel的使用分為兩部分:
- sentinel-dashboard:與hystrix-dashboard類似,但是它更為強大一些。除了與hystrix-dashboard一樣提供實時監控之外,還提供了流控規則、熔斷規則的在線維護等功能。
- 客戶端整合:每個微服務客戶端都需要整合sentinel的客戶端封裝與配置,才能將監控信息上報給dashboard展示以及實時的更改限流或熔斷規則等。
(1)啟動sentinel-dashboard
下載地址:sentinel-dashboard-1.6.0.jar
其他版本:Sentinel/releases
通過命令啟動:
java -jar sentinel-dashboard-1.6.0.jar
默認情況下,sentinel-dashboard以8080端口啟動。由于sentinel-dashboard是一個標準的spring boot應用,所以如果要自定義端口號等內容的話,可以通過在啟動命令中增加參數來調整,比如:
java -jar sentinel-dashboard-1.6.0.jar --server.port=8888
所以可以通過訪問:localhost:8888 來驗證是否已經啟動成功,如果一切順利的話,可以看到登錄頁面(默認用戶名和密碼都是sentinel)。
(2)整合Sentinel
依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
配置:
spring.application.name=alibaba-sentinel-rate-limiting
server.port=8002# sentinel dashboard
spring.cloud.sentinel.transport.dashboard=localhost:8888
主類:
package com.example.demospringboot;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@Slf4j
public class DemospringbootApplication {public static void main(String[] args) {SpringApplication.run(DemospringbootApplication.class, args);}@Slf4j@RestControllerstatic class TestController {@GetMapping("/hello")public String hello() {return "Hello World";}}
}
啟動應用,并執行curl命令:
此時,在上面啟動的Sentinel Dashboard中就可以當前我們啟動的alibaba-sentinel-rate-limiting這個服務以及接口調用的實時監控了。具體如下圖所示:
配置限流規則
在完成了上面的兩節之后,我們在alibaba-sentinel-rate-limiting服務下,點擊簇點鏈路菜單,可以看到如下界面:
通過點擊流控按鈕,來為該接口設置限流規則,比如:
流控模式:
- 直接:統計當前資源的請求,觸發閾值時對當前資源直接限流,也是默認模式。
- 關聯:統計與當前相關的另一個資源,觸發閾值時,對當前資源限流。
- 鏈路:統計從指定鏈路訪問到本資源的請求,觸發閾值時,對指定鏈路限流,即只限流從指定接口進來的
流控效果:
-
快速失效:達到閾值后,新的請求會被立即拒絕并拋出FlowException異常。是默認的處理方式。
-
warm up:預熱模式,對超出閾值的請求同樣是拒絕,并拋出異常。但這種模式閾值會動態變化,從一個較小的值逐漸增加到最大值。請求閾值初始值是 threshold/coldFactor(默認值是3),持續指定時長后,逐漸提高到threshould值。例如,我設置QPS的threshold的為10,預熱時間為5秒,那么初始閾值就是10/3,也就是3,然后在5秒后逐漸增長到10.
-
排隊等待:讓所有請求按照先后次序進入一個隊列中排隊執行,兩個請求的間隔不能小于指定時長。例如:QPS = 5,意味著每200ms處理一個隊列中的請求;timeout =2000,意味著預期等待超過2000ms的請求會被拒絕并拋出異常。
參考案例
點擊新增按鈕之后,可以看到如下界面:
其實就是左側菜單中流控規則的界面,這里可以看到當前設置的所有限流策略。在完成了上面所有內容之后,我們可以嘗試一下快速的調用這個接口,看看是否會觸發限流控制,比如:
可以看到,快速的調用/hello接口之后,調用被限流了。
在 sentinel-dashboard界面,也可以看到對應統計: