1. 程式人生 > 實用技巧 >sentinel限流的基本使用

sentinel限流的基本使用

sentinel概念

Sentinel以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

sentinel控制檯的概念

Sentinel控制檯(sentinel-dashboard)是流量控制、熔斷降級規則統一配置和管理的入口,它為使用者提供了機器自發現、簇點鏈路自發現、監控、規則配置等功能。在 Sentinel 控制檯上,我們可以配置規則並實時檢視流量控制效果。

sentinel-dashboard控制檯的下載和安裝

注意點

  • sentinel-dashboard控制檯只能進行單機部署。但是阿里巴巴同時提供了AHAS Sentinel企業級的控制檯實現高可用,同時提供更加詳細的資料展示和告警措施,這裡不再詳述,有意者自己去學習。
  • 啟動 Sentinel 控制檯需要 JDK 版本為 1.8 及以上版本
  • 若您的應用為 Spring Boot 或 Spring Cloud 應用,您可以通過 Spring 配置檔案來指定配置

依賴引用

注意:依賴引入事一定要注意和自己使用的springboot版本的對應,否者很可能無法正常使用

在父級模組進行管理alibaba的依賴
<dependencyManagement>
   <dependencies>
     <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import
</scope> </dependency> </dependencies> </dependencyManagement> 在相應的業務模組引入sentinel模組的依賴 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </exclusion> </exclusions> </dependency>

與springboot整合配置

  我使用的springboott專案版本為2.2.6.RELEASE,但我的專案只是一個簡單的springboot專案並非springcloud和dubbo專案,如果想在springcloud或者dubbo叢集專案中使用,還需要因為引入相應的介面卡模組,具體的可以參看GitHub中相關文件,文章最後會附上鍊接。

  其實sentinel和springboot的整合非常簡單,只需要幾個基本的配置即可,更多的配置github文件中有詳細的介紹。

註解解讀

@SentinelResource 註解

  Sentinel 提供了@SentinelResource註解用於定義資源,並提供了 AspectJ 的擴充套件用於自動定義資源、處理BlockException等。使用Sentinel Annotation AspectJ Extension的時候需要引入以下依賴:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>x.y.z</version>
</dependency>

註解中的配置項解讀

  • value:資源名稱,必需項(不能為空)
  • entryType:entry 型別,可選項(預設為EntryType.OUT
  • blockHandler/blockHandlerClass:blockHandler對應處理BlockException的函式名稱,可選項。blockHandler 函式訪問範圍需要是public,返回型別需要與原方法相匹配,引數型別需要和原方法相匹配並且最後加一個額外的引數,型別為BlockException。blockHandler 函式預設需要和原方法在同一個類中。若希望使用其他類的函式,則可以指定blockHandlerClass為對應的類的Class物件,注意對應的函式必需為 static 函式,否則無法解析。
  • fallback/fallbackClass:fallback 函式名稱,可選項,用於在丟擲異常的時候提供 fallback 處理邏輯。fallback 函式可以針對所有型別的異常(除了exceptionsToIgnore裡面排除掉的異常型別)進行處理。fallback 函式簽名和位置要求:
    • 返回值型別必須與原函式返回值型別一致;
    • 方法引數列表需要和原函式一致,或者可以額外多一個Throwable型別的引數用於接收對應的異常。
    • fallback 函式預設需要和原方法在同一個類中。若希望使用其他類的函式,則可以指定fallbackClass為對應的類的Class物件,注意對應的函式必需為 static 函式,否則無法解析
  • defaultFallback(since 1.6.0):預設的 fallback 函式名稱,可選項,通常用於通用的 fallback 邏輯(即可以用於很多服務或方法)。預設 fallback 函式可以針對所有型別的異常(除了exceptionsToIgnore裡面排除掉的異常型別)進行處理。若同時配置了 fallback 和 defaultFallback,則只有 fallback 會生效。defaultFallback 函式簽名要求:exceptionsToIgnore(since 1.6.0):用於指定哪些異常被排除掉,不會計入異常統計中,也不會進入 fallback 邏輯中,而是會原樣丟擲。
    • 返回值型別必須與原函式返回值型別一致;
    • 方法引數列表需要為空,或者可以額外多一個Throwable型別的引數用於接收對應的異常。
    • defaultFallback 函式預設需要和原方法在同一個類中。若希望使用其他類的函式,則可以指定fallbackClass為對應的類的Class物件,注意對應的函式必需為 static 函式,否則無法解析。

  特別地,若 blockHandler 和 fallback 都進行了配置,則被限流降級而丟擲BlockException時只會進入blockHandler處理邏輯。若未配置blockHandlerfallbackdefaultFallback,則被限流降級時會將BlockException直接丟擲(若方法本身未定義 throws BlockException 則會被 JVM 包裝一層UndeclaredThrowableException)。

  從 1.4.0 版本開始,註解方式定義資源支援自動統計業務異常,無需手動呼叫Tracer.trace(ex)來記錄業務異常。Sentinel 1.4.0 以前的版本需要自行呼叫Tracer.trace(ex)來記錄業務異常。

注意點:

  • 註解方式埋點不支援 private 方法
  • 1.6.0 之前的版本 fallback 函式只針對降級異常(DegradeException)進行處理,不能針對業務異常進行處理

@SentinelRestTemplate註解

學習連結

sentinel問題排查

sentinel的github文件