前言:不斷學習就是程序員的宿命
一、概述
Github官網:https://github.com/alibaba/Sentinel,就是SpringCloud的Hystrix
下載地址:https://github.com/alibaba/Sentinel/releases
二、Sentinel 控制台
1、啟動Sentinel
java -jar sentinel-dashboard-1.7.0.jar

2、登錄Web界面
瀏覽器訪問:http://localhost:8080/,用戶名密碼均為:sentinel

三、Sentinel流控規則

1、流控模式
1.1直接 (默認)
1.1.1 QPS直接失敗
以下設置表示:1秒鍾內查詢1次就是OK,若次數超過1,就直接-快速失敗,報默認錯誤

1.1.2線程數直接失敗

1.2、關聯
當關聯的資源達到閾值時,就限流自己;當與A關聯的資源B達到閾值時,就限流A自己(B惹事,A掛了)
設置:當關聯資源/testB的qps閾值超過1時,就限流/testA的Rest訪問地址,當關聯資源達到閾值后限制配置好的資源名。

2、流控效果
Github:https://github.com/alibaba/Sentinel/wiki/Flow-Control
2.1 直接-快速失敗
直接失敗,拋出異常:Blocked by Sentinel(flow limiting)
源碼:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
2.2 直接-預熱
默認coldFactor為3,即請求QPS從threshold/3開始,經預熱時長逐漸升至設定的QPS閾值。限流冷啟動
以下是指開始QPS為10/3=3,5秒后慢慢預熱至10

2.3排隊等待
勻速排隊,閾值必須設置為QPS(漏桶算法)
源碼:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
以下設置含義:/testA每秒1次請求,超過的話就排隊等待,等待的超時時間為20000毫秒。

四、Sentinel降級規則
Github:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

Sentinel斷路器沒有半開狀態(Hystrix斷路器是存在半開狀態的)
1、RT
以下表示:Jmeter永遠1秒鍾打進來10個線程(大於5,官網)調用testD,我們希望200毫米處理完本次任務。如果超過200毫秒還沒處理完,在未來1秒鍾的時間窗口內,斷路器打開(保險絲跳閘)微服務不可用,保險絲跳閘斷電。

2、異常比例
按照以下配置:
①單獨訪問一次,必然來一次報錯一次(int a =10/0;)

②開啟Jmeter,直接高並發發送請求,多次調用達到官網配置條件,斷路器開啟(保險絲跳閘)微服務不可用,不在報錯error而是服務降級了。

3、異常數
異常數是按照分鍾統計的,訪問:http://localhost:8401/testExceptionCount,第一次訪問絕對報錯(int a = 10/0);但是達到配置的閾值(5)次報錯后,進入熔斷后降級。

五、熱點規則
官網:https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
1、熱點key限流
配置第一個參數(索引0)閾值為1,違背則會進入Fallback兜底方法

2、參數例外項
基於上述熱點規則,期望p1參數當它為某個特殊值時,限流值與平時不太一樣(例如當p1=5時,它的閾值為200)

六、系統規則

從整體維度對應用入口流量進行控制,而之前限流是細粒度對某個方法進行QPS等配置,這個是整體級別的。
七、SentinelResource配置
Github:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
1、按資源名限流
關閉8401服務,查看流控規則消失,發現規則是臨時的

2、按URL地址限流

3、自定義限流處理邏輯
上述問題:
①系統默認的,沒有體現我們自己的業務要求
②依照現有條件,我們自定義的處理方法又和業務代碼耦合在一起,不直觀
③每個業務方法都添加一個兜底方法,那代碼膨脹
④全局統一的處理方法沒有體現
(1)新增自定義處理方法
public class CustomerBlockHandler { public static CommonResult handlerException(BlockException exception) { return new CommonResult(444, "客戶自定義,global handlerException---1"); } public static CommonResult handlerException2(BlockException exception) { return new CommonResult(444, "客戶自定義,global handlerException---2"); } }
(2)引用

八、Sentinel服務熔斷Ribbon
1、無配置

測試情況:

2、配置Fallback,只負責業務異常

測試情況:

3、配置blockhandler,只負責Sentinel控制台配置違規

測試情況:

4、配置Fallback和blockhandler

測試情況:

5、異常忽略-exceptionsToIgnore

測試情況:

九、Sentinel服務熔斷OpenFeign
1、application.yml開啟對feign支持
#激活sentinel對feign的支持 feign: sentinel: enabled: true
2、主類啟用注解@EnableFeignClients
3、Feign接口

測試情況:停掉9003提供者,服務降級了

十、熔斷框架比較

十一、Sentinel規則持久化
之前配置在Sentinel的規則在微服務重啟,規則丟失。
思路:將限流規則持久化進Nacos保存,只要刷新微服務的某個Rest地址,Sentinel控制台的流控規則就能看到,只要Nacos里面的配置不刪除,針對某個微服務的Sentinel規則持續有效
1、application.yml添加如下配置
server: port: 8401 spring: application: name: cloudalibaba-sentinel-service cloud: nacos: discovery: # Nacos服務注冊中心地址 server-addr: localhost:8848 sentinel: transport: # sentinel dashboard 地址 dashboard: localhost:8080 # 默認為8719,如果被占用會自動+1,直到找到為止 port: 8719 # 流控規則持久化到nacos datasource: dsl: nacos: server-addr: localhost:8848 data-id: ${spring.application.name} group-id: DEFAULT_GROUP data-type: json rule-type: flow management: endpoints: web: exposure: include: "*"
2、Nacos控制台新建配置文件
DataId為spring.application.name,json格式如下:
[ { "resource":"/rateLimit/byUrl", "limitApp":"default", "grade":1, "count":1, "strategy":0, "controlBehavior":0, "clusterMode":false } ]
①resource:資源名稱(默認請求路徑)
②limitApp:來源應用默認
③grade:閾值類型,0表示線程數,1表示QPS
④count:單機閾值
⑤strategy:流控模式,0表示直接,1表示關聯,2表示鏈路
⑥controlBehavior:流控效果:0表示快速失敗,1表示warmup,2表示排隊等待
⑦clusterMode:是否集群
3、測試情況

