SpringCloud微服務實戰——搭建企業級開發框架(十五):整合Sentinel高可用流量管理框架【熔斷降級】

全棧程式猿發表於2021-11-05

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

  Sentinel 提供以下幾種熔斷策略:

  • 慢呼叫比例 (SLOW_REQUEST_RATIO):選擇以慢呼叫比例作為閾值,需要設定允許的慢呼叫 RT(即最大的響應時間),請求的響應時間大於該值則統計為慢呼叫。當單位統計時長(statIntervalMs)內請求數目大於設定的最小請求數目,並且慢呼叫的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小於設定的慢呼叫 RT 則結束熔斷,若大於設定的慢呼叫 RT 則會再次被熔斷。
  • 異常比例 (ERROR_RATIO):當單位統計時長(statIntervalMs)內請求數目大於設定的最小請求數目,並且異常的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值範圍是 [0.0, 1.0],代表 0% - 100%。
  • 異常數 (ERROR_COUNT):當單位統計時長內的異常數目超過閾值之後會自動進行熔斷。經過熔斷時長後熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
    熔斷降級規則說明:
    熔斷降級規則(DegradeRule)包含下面幾個重要的屬性:
Field 說明 預設值
resource 資源名,即規則的作用物件
grade 熔斷策略,支援慢呼叫比例/異常比例/異常數策略 慢呼叫比例
count 慢呼叫比例模式下為慢呼叫臨界 RT(超出該值計為慢呼叫);異常比例/異常數模式下為對應的閾值
timeWindow 熔斷時長,單位為 s
minRequestAmount 熔斷觸發的最小請求數,請求數小於該值時即使異常比率超出閾值也不會熔斷 5
statIntervalMs 統計時長(單位為 ms),如 60*1000 代表分鐘級 1000 ms
slowRatioThreshold 慢呼叫比例閾值,僅慢呼叫比例模式有效

接下來我們對這三種熔斷策略分別進行配置測試:
1、壽險在SystemController.java裡面新增需要熔斷測試的介面

    @ApiOperation(value = "慢呼叫比例熔斷策略")
    @GetMapping(value = "sentinel/slow/request/ratio")
    public Result<string> sentinelRR() {
        try {
            double randomNumber;
            randomNumber = Math.random();
            if (randomNumber >= 0 && randomNumber <= 0.80) {
                Thread.sleep(300L);
            } else if (randomNumber >= 0.80 && randomNumber <= 0.80 + 0.10) {
                Thread.sleep(10L);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return Result.success("慢呼叫比例熔斷策略");
    }

    @ApiOperation(value = "異常比例熔斷策略")
    @GetMapping(value = "sentinel/error/ratio")
    public Result sentinelRatio() {
        int i = 1/0;
        return Result.success("異常比例熔斷策略");
    }

    @ApiOperation(value = "異常數熔斷策略")
    @GetMapping(value = "sentinel/error/count")
    public Result sentinelCount() {
        int i = 1/0;
        return Result.success("異常數熔斷策略");
    }

2、瀏覽器開啟Sentinel管理控制檯,開啟降級規則選單,新增降級規則,首先測試“慢呼叫比例”,根據官方介紹,最大RT是指最大允許的響應時間,我們這裡設定成200ms,比例閾值設定成0.8,熔斷時長為10s,最小請求數為5,意思是指:在1ms內請求數目大於5,並且慢呼叫的比例大於80%,則接下來的熔斷時長內請求會自動被熔斷,熔斷時長是10秒,10秒之後會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小於200ms, 則結束熔斷,若大於200ms 則會再次被熔斷。
image.png
3、開啟Jmeter,點選新建->測試計劃->執行緒組->HTTP請求-聚合報告。執行緒組設定為15,迴圈次數1000
image.png
image.png
4、測試結果
image.png
5、異常比例和異常數參考上面的測試方法進行測試,這裡不再贅述,只是測試之前需要把GitEgg-Platform裡面GitEggControllerAdvice.java統一異常處理的程式碼註釋掉,否則測試程式碼丟擲的異常會被捕獲,達不到預想的效果。

本文原始碼在https://gitee.com/wmz1930/GitEgg 的chapter-15分支。

相關文章