一直在用hystrix作熔斷降級,可是無奈hystrix官方已經再也不維護了,sentinel背後是阿里巴巴公司,而且一直在維護sentinel,因此先了解下,hystrix不夠用時,能夠換成sentineljava
而且特性豐富,這裏就使用以下兩個核心功能git
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默認重啓後熔斷規則會丟失,若是保存熔斷規則須要配置數據源,參考動態數據源支持