在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel
一直在用hystrix做熔斷降級,但是無奈hystrix官方已經不再維護了,sentinel背後是阿里巴巴公司,並且一直在維護sentinel,所以先了解下,hystrix不夠用時,可以換成sentinel
並且特性豐富,這裡就使用如下兩個核心功能
- 熔斷
- 流控
啟動Sentinel控制檯
sentinel的控制檯是由spring boot開發,特殊需求可以修改原始碼定製,原始碼參考: sentinel-dashboard 可以使用docker一鍵啟動控制檯
docker run --name sentinel-dashboard \ -it --rm -p 8719:8719 -p 8780:8080 sentinel-dashboard 複製程式碼
其中8080是sentinel web控制介面埠,8719是sentinel應用端和控制檯通訊埠,參考 配置控制檯資訊
開啟 本機ip:8780 檢視效果,預設的使用者名稱密碼都是 sentinel

建立測試專案並進行配置
在spring boot裡整合sentinel比較容易,找個現有的spring boot的專案,或者去https://start.spring.io/建立一個即可
引入sentinel包,這個包用來進行熔斷控制,同時會和sentinel控制檯進行通訊
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency> 複製程式碼
注意修改pom.xml檔案後記得reimport一下
在配置里加上和sentinel控制檯通訊的配置:src/main/resources/application.properties
spring.application.name=MySentinel spring.cloud.sentinel.eager= true spring.cloud.sentinel.transport.port= 8720 spring.cloud.sentinel.transport.dashboard= 127.0.0.1:8780 spring.cloud.sentinel.transport.heartbeat-interval-ms= 500 複製程式碼
注意這裡的8720埠是應用端的sentinel和sentinel控制檯通訊的埠
啟動專案在sentinel控制檯檢視效果

可以看到專案已經成功和sentinel控制檯建立了通訊
sentinel可以對多個http客戶端進行熔斷,參考: Feign & RestTemplate支援
這裡使用最常用的RestTemplate來進行請求
在spring boot main方法所在類裡配置允許sentinel對RestTemplate進行熔斷 核心程式碼如下:
@Bean @SentinelRestTemplate public RestTemplate restTemplate() { return new RestTemplate(); } 複製程式碼
這個SentinelRestTemplate註解有幾個事件回撥的引數,可以在熔斷時執行自定義的處理邏輯,參考: RestTemplate 支援
有時間可以去詳細研究下
編寫熔斷測試程式碼
在專案裡編寫測試控制器比如 MyController.java 核心程式碼如下
@RestController @RequestMapping("test") public class MyController { @GetMapping(value = "/hello") @SentinelResource("hello") public String hello() { return "Hello Sentinel"; } } 複製程式碼
SentinelResource註解裡的值是資源識別符號,可以為這個資源識別符號指定限流,熔斷規則等
在瀏覽器裡請求這個地址,然後檢視sentinel控制檯

可以看到sentinel控制檯已經成功監控到了這個測試的url
降級測試
編寫一個控制器路由,讓這個路由能夠觸發降級閾值,核心程式碼如下:
@GetMapping(value = "/mye") @SentinelResource("mye") public String mye() { if (true) { throw new RuntimeException("mye"); } return "mye Sentinel"; } 複製程式碼
可以看到這段程式碼是會100%丟擲異常
配置降級規則點選 降級規則->新作降級規則 按鈕新增降級規則

右鍵新視窗可以檢視大圖,這個熔斷規則是任務當請求裡的異常比例超過50%後,熔斷介面30秒
然後多次請求這個異常介面,檢視控制檯日誌,在幾次異常後,可以看到sentinel已經開始熔斷保護這個介面了

限流測試
編寫一個輸出字串的介面來測試,核心程式碼如下:
@GetMapping(value = "/myrate") @SentinelResource("myrate") public String myrate() { return "myrate Sentinel"; } 複製程式碼
新增限流規則

這裡為了看到效果,閾值設定得比較極端:qps超過1秒就限流
然後在瀏覽器裡訪問這個介面,按住ctrl+r模擬頻繁訪問的效果,因為閾值設定得比較極端,立刻就可以在應用控制檯裡看到已經觸發了sentinel的限流保護機制了

頁面上也開始提示No message了

一些注意的點
測試時注意埠不要衝突了,setinel控制檯佔用了兩個埠(8719, 8080),應用也會佔用兩個埠(8720, 8666), 8666應用web埠可以自行設定
應用的sentinel客戶端會快取sentinel控制檯的熔斷規則,如果sentinel控制檯宕機了,應用還會繼續使用快取的熔斷規則進行熔斷。可以重啟應用讓熔斷規則失效
docker的sentinel預設重啟後熔斷規則會丟失,如果儲存熔斷規則需要配置資料來源,參考 動態資料來源支援