在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel

蘇小林發表於2019-04-30

一直在用hystrix做熔斷降級,但是無奈hystrix官方已經不再維護了,sentinel背後是阿里巴巴公司,並且一直在維護sentinel,所以先了解下,hystrix不夠用時,可以換成sentinel

並且特性豐富,這裡就使用如下兩個核心功能

  1. 熔斷
  2. 流控

啟動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中3分鐘上手阿里巴巴服務熔斷系統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控制檯檢視效果

在spring boot中3分鐘上手阿里巴巴服務熔斷系統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控制檯

在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel
可以看到sentinel控制檯已經成功監控到了這個測試的url

降級測試

編寫一個控制器路由,讓這個路由能夠觸發降級閾值,核心程式碼如下:

@GetMapping(value = "/mye")
@SentinelResource("mye")
public String mye() {
    if (true) {
        throw new RuntimeException("mye");
    }
    return "mye Sentinel";
}
複製程式碼

可以看到這段程式碼是會100%丟擲異常

配置降級規則 點選 降級規則->新作降級規則 按鈕新增降級規則

在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel

右鍵新視窗可以檢視大圖,這個熔斷規則是任務當請求裡的異常比例超過50%後,熔斷介面30秒

然後多次請求這個異常介面,檢視控制檯日誌,在幾次異常後,可以看到sentinel已經開始熔斷保護這個介面了

在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel

限流測試

編寫一個輸出字串的介面來測試,核心程式碼如下:

@GetMapping(value = "/myrate")
@SentinelResource("myrate")
public String myrate() {
    return "myrate Sentinel";
}
複製程式碼

新增限流規則

在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel
這裡為了看到效果,閾值設定得比較極端:qps超過1秒就限流

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

在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel

頁面上也開始提示No message了

在spring boot中3分鐘上手阿里巴巴服務熔斷系統sentinel

一些注意的點

測試時注意埠不要衝突了,setinel控制檯佔用了兩個埠(8719, 8080),應用也會佔用兩個埠(8720, 8666), 8666應用web埠可以自行設定

應用的sentinel客戶端會快取sentinel控制檯的熔斷規則,如果sentinel控制檯當機了,應用還會繼續使用快取的熔斷規則進行熔斷。可以重啟應用讓熔斷規則失效

docker的sentinel預設重啟後熔斷規則會丟失,如果儲存熔斷規則需要配置資料來源,參考動態資料來源支援

相關文章