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

  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統一異常處理的程式碼注釋掉,否則測試程式碼拋出的異常會被捕獲,達不到預想的效果。

本文源碼在//gitee.com/wmz1930/GitEgg 的chapter-15分支。