熔斷降級
- 對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一;
- 對不穩定的弱依賴服務調用進行熔斷降級,暫時切斷不穩定調用,避免局部不穩定因素導致整體的雪崩;
- 熔斷降級作為保護自身的手段,通常在客戶端(調用端)進行配置;
換個通俗的說法,如下
降級:保證主服務,停止其他不是主要的服務;
熔斷:當服務調用第二/三方服務出現不可用或超時等情況,為防止系統線程池占滿而出現雪崩,暫時對服務停止調用;
Sentinel降級規則
官方文檔:[https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7]
- Sentinel 熔斷策略
- 慢調用比例 (
SLOW_REQUEST_RATIO
):選擇以慢調用比例作為閾值,需要設置允許的慢調用 RT(即最大的響應時間),請求的響應時間大於該值則統計為慢調用。當單位統計時長(statIntervalMs
)內請求數目大於設置的最小請求數目,並且慢調用的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小於設置的慢調用 RT 則結束熔斷,若大於設置的慢調用 RT 則會再次被熔斷;- 比例閾值:慢調用統計數對於最小請求數的占有比例;
- 注:比例閾值是Sentinel1.8.x版本的,如果比例閾值修改不生效/降級失敗,需要將要將應用中的Sentinel的依賴改到相應的版本;
- 關於Spring Cloud Alibaba 各組件的適配版本,參考:[https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E]
- 比例閾值修改無效,參考:[https://github.com/alibaba/Sentinel/issues/1777]
- 熔斷時長:超過時間后會嘗試恢復;
- 最小請求數:觸發熔斷的最小請求數目,若當前統計窗口內的請求數小於此值,即使達到了熔斷條件也不會觸發;
- 比例閾值:慢調用統計數對於最小請求數的占有比例;
- 慢調用比例 (
-
- 異常比例 (
ERROR_RATIO
):當單位統計時長(statIntervalMs
)內請求數目大於設置的最小請求數目,並且異常的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值范圍是[0.0, 1.0]
,代表 0% - 100%;
- 異常比例 (
-
-
- 比例閾值:異常數對於最小請求數的占有比例;
- 熔斷時長:超過時間后會嘗試恢復;
- 最小請求數:熔斷觸發的最小請求數,請求數小於該值時即使異常比率超出閾值也不會熔斷;
-
-
- 異常數 (
ERROR_COUNT
):當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷;
- 異常數 (
-
-
- 異常數:統計的異常數;
- 熔斷時長:超過時間后會嘗試恢復;
- 最小請求數:熔斷觸發的最小請求數,請求數小於該值時即使異常比率超出閾值也不會熔斷;
-
注:注意異常降級僅針對業務異常,對 Sentinel 限流降級本身的異常(BlockException
)不生效;
服務熔斷的三種狀態
-
熔斷關閉(Closed)
- 服務沒有故障時,熔斷器所處的狀態,對調用方的調用不做任何限制;
-
熔斷開啟(Open)
- 后續對該服務接口的調用不再經過網絡,直接執行本地的fallback方法;
-
半熔斷(Half-Open)
- 所謂半熔斷就是嘗試恢復服務調用,允許有限的流量調用該服務,並監控調用成功率;
如下圖:
-
- 熔斷恢復:
-
經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態)嘗試恢復服務調用,允許有限的流量調用該服務,並監控調用成功率;
-
如果成功率達到預期,則說明服務已恢復,進入熔斷關閉狀態;如果成功率仍舊很低,則重新進入熔斷狀態;
-
- 熔斷恢復:
Sentinel自定義異常降級處理
Spring Cloud Alibaba從2.1.0版本到2.2.0版本升級后,Sentinel里面依賴進行了改動,且不向下兼容;
舊版:實現UrlBlockHandler並重寫blocked方法;
新版:實現BlockExceptionHandler並重寫handle方法;
Sentinel中的異常總類:
Sentinel 限流降級本身的異常 BlockException 限流異常 FlowException 降級異常 DegradeException 參數限流異常 ParamFlowException 系統負載異常 SystemBlockException 授權異常 AuthorityException
Feign整合Sentinel
feign: sentinel: enabled: true