一、認識下Sentinel
Sentinel使用流程:微服務會集成Sentinel客戶端,從官方下載jar啟動作為服務端,在有配置變更和添加的時候Sentinel會發送消息給客戶端,進行變更應用。
Sentinel 分為兩個部分:
核⼼庫:(Java 客戶端)不依賴任何框架/庫,能夠運⾏於所有 Java 運⾏時環境,同時對 Dubbo /Spring Cloud 等框架也有較好的⽀持。
控制台:(Dashboard)基於 Spring Boot 開發,打包后可以直接運⾏,不需要額外的 Tomcat 等應⽤容器。
豐富的應⽤場景:Sentinel 承接了阿⾥巴巴近 10 年的雙⼗⼀⼤促流量的核⼼場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、消息削峰填⾕、集群流量控制、實時熔斷下游不可⽤應⽤等。 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制台中看到接⼊應⽤的單台機器秒級數據,甚⾄ 500 台以下規模的集群的匯總運⾏情況。 ⼴泛的開源⽣態:Sentinel 提供開箱即⽤的與其它開源框架/庫的整合模塊,例如與 SpringCloud、Dubbo的整合。您只需要引⼊相應的依賴並進⾏簡單的配置即可快速地接⼊ Sentinel。 完善的 SPI 擴展點:Sentinel 提供簡單易⽤、完善的 SPI 擴展接⼝。您可以通過實現擴展接⼝來快速地定制邏輯。例如定制規則管理、適配動態數據源等。
sentinel資源概念,不配置spring.cloud.sentinel.eager=true參數,@RequestMapping不會別識別,懶加載模式
二、Sentinel簡單實戰
Sentinel官方版本下載地址: https://github.com/alibaba/Sentinel/releases
快速下載啟動開發環境:國內朋友可以考慮使用docker配置國內鏡像源,
直接執行:docker run --name sentinel -p 8858:8858 -d bladex/sentinel-dashboard
1、搭建Sentinel服務端
如下下載的jar包直接執行以下命令即可啟動服務。
java -jar sentinel-dashboard-1.7.1.jar &
jar命令啟動完成,登錄地址 http://localhost:8080, ⽤戶名/密碼:sentinel/sentinel
docker啟動完成,登錄地址 http://localhost:8858, ⽤戶名/密碼:sentinel/sentinel
2、搭建Sentinel客戶端
第一步、先引入pom文件,注意沒有使用maven統一管理版本號的,需要指定version字段
<!--借用監控開放端口--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--sentinel 核⼼環境 依賴--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
第二步、修改配置文件
注意:dashboard 為sentinel服務的客戶端,port為客戶端自己開發端口,用於接收服務端發送的限流數據,port可以隨意更改。
spring: sentinel: transport: #sentinel dashboard/console 地址 dashboard: 127.0.0.1:8858 # sentinel會在該端⼝啟動http server,那么這樣的話,控制台定義的⼀些限流等規則才能發送傳遞過來, port: 8719 #暴露出來健康檢查和檢測的接口 management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always
第三步、啟動項目訪問Sentenl即可生效
三、Sentinel高級應用
1、流控規則
在Sentinel服務的管理台,會列出服務的菜單,點擊服務-->簇點鏈路-->流控,出現下圖頁面。
重點屬性介紹
資源名: 默認請求路徑 針對來源: Sentinel可以針對調⽤者進⾏限流,填寫微服務名稱,默認default(不區分來源) 閾值類型/單機閾值 QPS:(每秒鍾請求數量)當調⽤該資源的QPS達到閾值時進⾏限流 線程數:當調⽤該資源的線程數達到閾值的時候進⾏限流(線程處理請求的時候,如果說業務邏輯執⾏時間很⻓,流量洪峰來臨時,會耗費很多線程資源,這些線程資源會堆積,最終可能造成服務不可⽤,進⼀步上游服務不可⽤,最終可能服務雪崩) 是否集群: 是否集群限流 流控模式: 直接:資源調⽤達到限流條件時,直接限流 關聯:關聯的資源調⽤達到閾值時候限流⾃⼰ 鏈路:只記錄指定鏈路上的流量 流控效果: 快速失敗:直接失敗,拋出異常 Warm Up:根據冷加載因⼦(默認3)的值,從閾值/冷加載因⼦,經過預熱時⻓,才達到設置的QPS閾值 排隊等待:勻速排隊,讓請求勻速通過,閾值類型必須設置為QPS,否則⽆效
2、Sentinel 降級規則模塊
RT(平均響應時間 ) 當 1s 內持續進⼊ >=5 個請求,平均響應時間超過閾值(RT以 ms 為單位),那么在接下的時間窗⼝(以 s 為單位)之內,對這個⽅法的調⽤都會⾃動地熔斷(拋出 DegradeException)。注意Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。 異常⽐例 當資源的每秒請求量 >= 5,並且每秒異常總數占通過量的⽐值超過閾值之后,資源進⼊降級狀態,即在接下的時間窗⼝(以 s 為單位)之內,對這個⽅法的調⽤都會⾃動地返回。異常⽐率的閾值范圍是 [0.0, 1.0] ,代表 0% - 100%。 異常數 當資源近 1 分鍾的異常數⽬超過閾值之后會進⾏熔斷。注意由於統計時間窗⼝是分鍾級別的,若timeWindow ⼩於 60s,則結束熔斷狀態后仍可能再進⼊熔斷狀態。
3、Sentinel ⾃定義兜底邏輯
注意:兜底⽅法非本類需要為static靜態⽅法,同時指定資源類,可以為當前類的非靜態方法,blockHandler保持返回值與參數一致的同時在添加com.alibaba.csp.sentinel.slots.block.BlockException類型的參數,用於接收sentinel異常,fallback方法為java異常返回方法
@SentinelResource注解類似於Hystrix中的@HystrixCommand注解
@SentinelResource 注解常用屬性
value:定義資源名唯一或共享(針對接口級別線程池)
blockHandlerClass:指定Sentinel規則異常兜底邏輯所在class類
blockHandler:指定Sentinel規則異常兜底邏輯具體哪個⽅法
fallbackClass:指定Java運⾏時異常兜底邏輯所在class類
fallback:指定Java運⾏時異常兜底邏輯具體哪個⽅法
https://www.jianshu.com/p/d36f55ef2688?utm_campaign=haruki