天天看點

sentinel怎樣實作熔斷降級? | 帶你讀《Spring Cloud Alibaba(2019)》之十六

上一篇:SpringCloud網關如何實作限流? | 帶你讀《Spring Cloud Alibaba(2019)》之十五 下一篇:Sentinel實作熱點詞限流 | 帶你讀《Spring Cloud Alibaba(2019)》之十七

本文來自于《精通Spring Cloud Alibaba》課程的整理,講師為餘勝軍,

點選檢視視訊内容

本文系志願者整理,供配合學習中心課程使用,不做商業用途。

sentinel實作熔斷降級

熔斷降級介紹

sentinel支援服務的熔斷降級

熔斷類似于保險絲,在超出了門檻值的情況下,在一定的時間内不會執行業務邏輯,直接執行服務降級的方法。

服務降級:利用本地fallback方法,傳回一個有好的提示給用戶端,不會真實的去執行業務邏輯。

除了流量控制以外,對調用鍊路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。由于調用關系的複雜性,如果調用鍊路中的某個資源不穩定,最終會導緻請求發生堆積。Sentinel 熔斷降級會在調用鍊路中某個資源出現不穩定狀态時(例如調用逾時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導緻級聯錯誤。當資源被降級後,在接下來的降級時間視窗之内,對該資源的調用都自動熔斷(預設行為是抛出 DegradeException)。

降級的政策

1.平均響應時間 (DEGRADE_GRADE_RT)

當 1s 内持續進入 5 個請求,對應時刻的平均響應時間(秒級)均超過門檻值(count,以 ms 為機關),那麼在接下的時間視窗(DegradeRule 中的 timeWindow,以 s 為機關)之内,對這個方法的調用都會自動地熔斷(抛出 DegradeException)。注意 Sentinel 預設統計的 RT 上限是 4900 ms,超出此門檻值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。

2.異常比例(DEGRADE_GRADE_EXCEPTION_RATIO)

當資源的每秒請求量 >= 5,并且每秒異常總數占通過量的比值超過門檻值(DegradeRule 中的 count)之後,資源進入降級狀态,即在接下的時間視窗(DegradeRule 中的 timeWindow,以 s 為機關)之内,對這個方法的調用都會自動地傳回。異常比率的門檻值範圍是 [0.0, 1.0],代表 0% - 100%。

3.異常數(DEGRADE_GRADE_EXCEPTION_COUNT)

當資源近 1 分鐘的異常數目超過門檻值之後會進行熔斷。注意由于統計時間視窗是分鐘級别的,若 timeWindow 小于 60s,則結束熔斷狀态後仍可能再進入熔斷狀态。

平均的響應時間

sentinel怎樣實作熔斷降級? | 帶你讀《Spring Cloud Alibaba(2019)》之十六

如果在1s秒,平均有5個請求的響應時間大于配置的10rt毫秒時間 門檻值,則會執行一定時間視窗的熔斷和降級。

基于平均相應時間實作降級代碼:

@SentinelResource(value = "getOrderDowngradeRtType", fallback = "getOrderDowngradeRtTypeFallback")
@RequestMapping("/getOrderDowngradeRtType")
public String getOrderDowngradeRtType() {
    try {
        Thread.sleep(300);
    } catch (Exception e) {
    }
    return "getOrderDowngradeRtType";
}

public String getOrderDowngradeRtTypeFallback() {
    return "服務降級啦,目前伺服器請求次數過多,請稍後重試!";
}           

異常的比例

sentinel怎樣實作熔斷降級? | 帶你讀《Spring Cloud Alibaba(2019)》之十六

當我們每秒的請求大于5的時候,會根據一定比例執行我們的熔斷降級的政策。

@SentinelResource(value = "getOrderDowngradeErrorType", fallback = "getOrderDowngradeErrorTypeFallback")
@RequestMapping("/getOrderDowngradeErrorType")
public String getOrderDowngradeErrorType(int age) {
    int j = 1 / age;
    return "正常執行我們的業務邏輯";
}

public String getOrderDowngradeErrorTypeFallback(int age) {
    return "服務降級啦,目前伺服器請求次數過多,請稍後重試!";
}           

異常的次數

sentinel怎樣實作熔斷降級? | 帶你讀《Spring Cloud Alibaba(2019)》之十六