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

一直在用hystrix作熔斷降級,可是無奈hystrix官方已經再也不維護了,sentinel背後是阿里巴巴公司,而且一直在維護sentinel,因此先了解下,hystrix不夠用時,能夠換成sentineljava

而且特性豐富,這裏就使用以下兩個核心功能git

  1. 熔斷
  2. 流控

啓動Sentinel控制檯

sentinel的控制檯是由spring boot開發,特殊需求能夠修改源碼定製,源碼參考:sentinel-dashboard 可使用docker一鍵啓動控制檯 編寫sentinel-dashboard的Dockerfilegithub

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 . 而後啓動web

docker run --name sentinel-dashboard \
    -it --rm -p 8719:8719 -p 8780:8080 sentinel-dashboard
複製代碼

其中8080是sentinel web控制界面端口,8719是sentinel應用端和控制檯通訊端口,參考配置控制檯信息 spring

打開 本機ip:8780 查看效果,默認的用戶名密碼都是 sentinel docker

建立測試項目並進行配置

在spring boot裏集成sentinel比較容易,找個現有的spring boot的項目,或者去https://start.spring.io/建立一個便可shell

引入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.propertiesbash

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默認重啓後熔斷規則會丟失,若是保存熔斷規則須要配置數據源,參考動態數據源支持

相關文章
相關標籤/搜索