1. 程式人生 > 其它 >Sentinel 降級規則

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 class
FlowLimitController { @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秒。