天天看點

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

Sentinel降級與熱點參數限流規則

  • 1、概述
  • 2、熔斷政策
  • 3、@SentinelResource注解
  • 4、熔斷降級測試
  • 5、熱點參數限流
    • 5.1 配置熱點參數限流
    • 5.2 測試熱點參數限流

1、概述

  除了流量控制以外,對調用鍊路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。一個服務常常會調用别的子產品,可能是另外的一個遠端服務、資料庫,或者第三方 API 等。例如,支付的時候,可能需要遠端調用銀聯提供的 API;查詢某個商品的價格,可能需要進行資料庫查詢。然而,這個被依賴服務的穩定性是不能保證的。如果依賴的服務出現了不穩定的情況,請求的響應時間變長,那麼調用服務的方法的響應時間也會變長,線程會産生堆積,最終可能耗盡業務自身的線程池,服務本身也變得不可用。
Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

  現代微服務架構都是分布式的,由非常多的服務組成。不同服務之間互相調用,組成複雜的調用鍊路。以上的問題在鍊路調用中會産生放大的效果。複雜鍊路上的某一環不穩定,就可能會層層級聯,最終導緻整個鍊路都不可用。是以我們需要對不穩定的弱依賴服務調用進行熔斷降級,暫時切斷不穩定調用,避免局部不穩定因素導緻整體的雪崩。熔斷降級作為保護自身的手段,通常在用戶端(調用端)進行配置。

2、熔斷政策

我看官網現在sentinel的文檔是1.8的,和我現在1.7.2的文檔有些許差别,你在使用的時候注意下自己的版本
Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

3、@SentinelResource注解

@SentinelResource 用于定義資源,并提供可選的異常處理和 fallback 配置項。 @SentinelResource 注解包含以下屬性:

  • value:資源名稱,必需項(不能為空)
  • entryType:entry 類型,可選項(預設為 EntryType.OUT)
  • blockHandler / blockHandlerClass: blockHandler 對應處理 BlockException 的函數名稱,可選項。blockHandler 函數通路範圍需要是 public,傳回類型需要與原方法相比對,參數類型需要和原方法相比對并且最後加一個額外的參數,類型為 BlockException。blockHandler 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
  • fallback:fallback 函數名稱,可選項,用于在抛出異常的時候提供 fallback 處理邏輯。fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 裡面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:

    傳回值類型必須與原函數傳回值類型一緻;

    方法參數清單需要和原函數一緻,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。

    fallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

  • defaultFallback(since 1.6.0):預設的 fallback 函數名稱,可選項,通常用于通用的 fallback 邏輯(即可以用于很多服務或方法)。預設 fallback 函數可以針對是以類型的異常(除了 exceptionsToIgnore 裡面排除掉的異常類型)進行處理。若同時配置了 fallback 和 defaultFallback,則隻有 fallback 會生效。defaultFallback 函數簽名要求:

    傳回值類型必須與原函數傳回值類型一緻;

    方法參數清單需要為空,或者可以額外多一個 Throwable 類型的參數用于接收對應的異常。

    defaultFallback 函數預設需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。

  • exceptionsToIgnore(since 1.6.0):用于指定哪些異常被排除掉,不會計入異常統計中,也不會進入 fallback 邏輯中,而是會原樣抛出。
注:1.6.0 之前的版本 fallback 函數隻針對降級異常(DegradeException)進行處理,不能針對業務異常進行處理。

特别地,若 blockHandler 和 fallback 都進行了配置,則被限流降級而抛出 BlockException 時隻會進入 blockHandler 處理邏輯。若未配置

blockHandler

fallback

defaultFallback

,則被限流降級時會将

BlockException

直接抛出。

4、熔斷降級測試

測試使用的controller:

@RestController
@Slf4j
public class DemoController {

    //blockHandler 使用sentinel進行不同規則控制時的預設處理方案
    // fallback:自定義業務出錯時預設處理方案
    // defaultFallback 指定一個業務錯誤時預設方案
    @GetMapping("/demo")
    @SentinelResource(value = "aaaa",blockHandler = "blockHandler",fallback = "fallCustomer",defaultFallback = "defaultFall") //作用:代表這是一個sentinel資源
    public String demo(Integer id){
        log.info("demo ok...");
        if(id<0){
            throw new RuntimeException("id無效");
        }
        return "demo ok !!!";
    }

    @GetMapping("/test")
    public String test(){
        log.info("test ok...");
        return "test ok !!!";
    }

    //
    public String blockHandler(Integer id, BlockException e){
        if(e instanceof FlowException){
            return "目前請求過于火爆,您已被流控!!";
        }
        if(e instanceof DegradeException){
            return "目前請求過于火爆,您已被降級!!";
        }
        if(e instanceof ParamFlowException){
            return "目前請求過于火爆,您已被熱點參數限流!!";
        }
        return "伺服器快爆了,請稍後再試!!!";
    }
    //
    public String defaultFall(){
        return "預設處理:伺服器出錯了!!!";
    }

    public String fallCustomer(Integer id){
        return "自定義伺服器出錯啦!!!";
    }
}
           
上面的fallback屬性和defaultFallback是我們指定業務代碼中抛出異常的解決辦法,優先執行fallback屬性。
Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

啟動微服務之後,發現sentinel dashboard的/demo下面多了一個aaaa的資源(名字你随便起)

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

編輯降級規則

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

我的代碼中寫的是id小于0時會抛出異常,而我麼能配置的降級規則中配置的是當異常數大于2時,會觸發降級,時間間隔為30秒。

我們故意頻繁出發異常,可以看到,此時已經出發降級,執行的是注解中的

blockHandler = "blockHandler"

指定的blockHandler方法。

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

5、熱點參數限流

5.1 配置熱點參數限流

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流
Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

5.2 測試熱點參數限流

  若是正常的參數,則當門檻值超過10(每秒處理的請求超過10)的時候限流,若是熱點參數的時候,上圖中我們配置的意思是當參數值為12或者14(也就是熱點參數)的時候,限流門檻值分别為1和3,直接觸發限流。

  先通路個正常的

http://localhost:8998/demo?id=111

,多發送幾次也沒有觸發限流。

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

通路熱點參數

隻通路一次,沒有問題,因為我們當id=14配置的是每秒最多處理3個請求

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流

但是,當我們頻繁發送熱點請求的時候,可以看到,已經被限流,并執行了

@SentinelResource

注解中

blockHandler = "blockHandler"

所指定的方法。

Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流
Sentinel降級與熱點參數限流規則1、概述2、熔斷政策3、@SentinelResource注解4、熔斷降級測試5、熱點參數限流
限流規則還挺多的,系統規則,授權規則等等我還得慢慢摸索。

繼續閱讀