Sentinel 降級規則
一 、Sentinel 熔斷降級簡介
Sentinel 熔斷降級會在呼叫鏈路中某個資源出現不穩定狀態時(例如呼叫超時或異常比例升高),對這個資源的呼叫進行限制,讓請求快速失敗,避免影響到其他的資源而導致級聯錯誤。
當資源被降級後,在接下來的降級時間視窗之內,對該資源的呼叫都自動熔斷(預設行為是丟擲DegradeException)。
Sentinel的熔斷器是沒有半開狀態的。
半開的狀態系統自動去檢測是否請求有異常,沒有異常就關閉熔斷器恢復使用,有異常則繼續開啟斷路器不可用。具體可參考Hystrix。
1.1 RT(平均響應時間,秒級)
平均響應時間 超出閾值 且 在時間視窗內通過的請求>=5,兩個條件同時滿足後觸發降級
視窗期過後關閉熔斷器
RT最大4900(更大的需要通過-Dcsp.sentinel.statistic.max.rt=xxxxx才能生效)
- 說明:
平均響應時間:當1s內持續進入5個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以ms為單位),那麼在接下的時間視窗(DegradeRule中的timeWindow,以s為單位)之內,對這個方法的呼叫都會自動的熔斷(丟擲DegradeException)。
注意Sentinel預設統計的RT上限是4900ms,超出此閾值的都會算作4900ms,若需要變更此上限可以通過啟用配置項Dcsp.sentinel.statistic.max.rt=xxxxx來配置。
- 修改java程式碼:
package com.ckfuture.springcloud.alibaba.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; @RestController @Slf4j public classFlowLimitController { @GetMapping("/testA") public String testA() { log.info(Thread.currentThread().getName()+"\t"+".....testA"); return "------testA"; } @GetMapping("/testB") public String testB() { return "------testB"; } @GetMapping("/testD") public String testD(){ try{ TimeUnit.SECONDS.sleep(1); }catch (InterruptedException e){e.printStackTrace();} log.info("testD 測試RT"); return "------testD"; } }
配置降級規則:
1.2 異常比例(秒級)
QPS>=5且異常比例(秒級統計)超過閾值時,觸發降級;時間視窗結束後,關閉降級
修改java程式碼:
@GetMapping("/testD") public String testD(){ int i=10/0; log.info("testD 測試異常比例"); return "------testD"; }
配置降級規則:
利用jmeter測試併發測試後,訪問介面熔斷降級了。
總結:
單獨訪問一次,必然來一次報錯一次(int i=10/0),呼叫一次錯一次;
因為異常比例沒有達到1秒請求量超過5個。沒有觸發降級配置條件,當開啟jmeter後,直接高併發傳送請求,多次呼叫達到我們的配置條件了,熔斷器開啟(保險絲跳閘)。微服務不可用了,不再報錯error而是服務降級了。
1.3 異常數(分鐘級)
異常數(分鐘統計)超過閾值時,觸發降級;時間視窗結束後,關閉降級
當資源近1分鐘的異常數目超過閾值之後會進行熔斷,注意由於統計時間視窗是分鐘級別的,若timeWindow小於60s,則結束熔斷狀態後仍可能在進入熔斷狀態。
時間視窗一定要大於等於60秒。