一直在用hystrix做熔斷降級,但是無奈hystrix官方已經不再維護了,sentinel背後是阿里巴巴公司,並且一直在維護sentinel,所以先了解下,hystrix不夠用時,可以換成sentinel
並且特性豐富,這裡就使用如下兩個核心功能
- 熔斷
- 流控
啟動Sentinel控制檯
sentinel的控制檯是由spring boot開發,特殊需求可以修改原始碼定製,原始碼參考:sentinel-dashboard 可以使用docker一鍵啟動控制檯 編寫sentinel-dashboard的Dockerfile
FROM openjdk:8-jdk-alpine
ADD https://github.com/alibaba/Sentinel/releases/download/1.6.0/sentinel-dashboard-1.6.0.jar /sentinel-dashboard-1.6.0.jar
ENTRYPOINT ["java", "-Dserver.port=8080", "-Dcsp.sentinel.dashboard.server=localhost:8080", "-Dproject.name=sentinel-dashboard", "-jar", "/sentinel-dashboard-1.6.0.jar", "-Dfile.encoding=utf-8"]
複製程式碼
構建sentinel-dashboard映象:docker build -t sentinel-dashboard .
然後啟動
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預設重啟後熔斷規則會丟失,如果儲存熔斷規則需要配置資料來源,參考動態資料來源支援