SpringCloud Alibaba之Sentinel服務降級策略實戰-RT、異常比例、異常數

所有代碼都在github上:https://github.com/demonruin/cloud2020/tree/master

RT:

平均響應時間 (DEGRADE_GRADE_RT):當 1s 內持續進入 N 個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以 ms 爲單位),那麼在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地熔斷(拋出 DegradeException)。注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啓動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。

上圖表示 需要1s持續進入5個請求,並且 平均響應時間大於 閾值,纔會觸發降級,打開斷路器,等時間窗口結束,再關閉降級

1、添加testD接口,接口中設置1秒睡眠時間,即模擬響應時間爲1s

    @GetMapping("/testD")
    public String testD()
    {
        try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}
        log.info(Thread.currentThread().getName()+"\t"+"...testD 測試RT");
        return "------testD 測試RT";
    }

2、Sentinel-dashboard中進行接口testD的RT設置,需要先請求一次testD,要不然dashboard中不會出現,設置降級策略爲RT,RT值爲200毫秒,時間窗口之降級時間間隔爲1s,單位是秒

3、通過Jmeter做壓力測試,設置請求testD接口,1秒內10個線程請求,永遠循環

4、先請求一次testD接口沒問題,再開啓Jmeter壓測,再瀏覽器請求一次testD發現已經快速失敗了

5、測試結果表明RT策略成功,因爲一秒10個線程請求滿足了 RT的一秒5個請求,然後testD休眠1s滿足了RT策略裏的200ms閾值,所以能測試成功。

永遠一秒鐘打進來10個線程(大於5個了)調用testD,我們希望200毫秒處理完本次任務,
如果超過200毫秒還沒處理完,在未來1秒鐘的時間窗口內,斷路器打開(保險絲跳閘)微服務不可用,保險絲跳閘斷電了。後續我停止jmeter,沒有這麼大的訪問量了,斷路器關閉(保險絲恢復),微服務恢復OK

 

異常比例:

異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):當資源的每秒請求量 >= N(可配置),並且每秒異常總數佔通過量的比值超過閾值(DegradeRule 中的 count)之後,資源進入降級狀態,即在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地返回。異常比率的閾值範圍是 [0.0, 1.0],代表 0% - 100%。

上圖表示 QPS>=5 且異常比例超過閾值,觸發降級,打開斷路器,等時間窗口結束,再關閉降級

1、添加testF接口,接口中設置10/0,即模擬運行時異常

    @GetMapping("/testF")
    public String testF()
    {
        log.info(Thread.currentThread().getName()+"\t"+"...testF 測試 異常比例");
        int i = 10/0;
        return "------test 測試 異常比例";
    }

2、Sentinel-dashboard中進行接口testD的 異常比例 設置,設置降級策略爲 異常比例  ,異常比例爲0.2即20%,時間窗口爲3s

3、通過Jmeter進行壓測,設置請求testF接口,1秒內10個線程請求,永遠循環

4、先請求一次testF接口,會報by zero異常,當開啓Jmeter壓測後,再訪問testF會快速失敗,等關閉Jmeter後,再請求接口,又會報by zero異常

5、按照上述配置,單獨訪問一次,必然來一次報錯一次(int age = 10/0), 調一次錯一次;

    開啓jmeter後,直接高併發發送請求,多次調用達到我們的配置條件了。斷路器開啓(保險絲跳閘),微服務不可用了,不再報錯error而是服務降級了。等關閉jmeter後,又恢復了,所以又請求一次報錯一次

 

異常數:

異常數 (DEGRADE_GRADE_EXCEPTION_COUNT):當資源近 1 分鐘的異常數目超過閾值之後會進行熔斷。注意由於統計時間窗口是分鐘級別的,若 timeWindow 小於 60s,則結束熔斷狀態後仍可能再進入熔斷狀態。

異常數是按分鐘來統計的,所以時間窗口必須大於等於60s

上圖就是表示,在一分鐘內統計異常數超過閾值了,然後出發降級,打開斷路器,等時間長款結束,關閉降級

1、添加testE接口,接口中設置10/0,即模擬運行時異常

    @GetMapping("/testE")
    public String testE()
    {
        log.info(Thread.currentThread().getName()+"\t"+"...testE 測試 異常數");
        int i = 10/0;
        return "------testE 測試 異常數";
    }

2、在sentinel-dashboard中設置testE的降級策略爲異常數,異常數爲5,時間窗口爲70s

3、請求接口testE,請求一次爲by zero異常,請求兩次也是報錯,等請求到五次後就會出現服務降級,直接快速失敗,等超過70s窗口期後,再請求testE,又會開始 異常數策略統計

至此,Sentinel中的服務降級 三種策略 RT、異常比例、異常數的demo演示案例上述已經演示完畢~~~~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章