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
處理邏輯。若未配置blockHandler
、fallback
和defaultFallback
,則被限流降級時會將BlockException
直接丟擲(若方法本身未定義 throws BlockException 則會被 JVM 包裝一層UndeclaredThrowableException
)。
從 1.4.0 版本開始,註解方式定義資源支援自動統計業務異常,無需手動呼叫Tracer.trace(ex)
來記錄業務異常。Sentinel 1.4.0 以前的版本需要自行呼叫Tracer.trace(ex)
來記錄業務異常。
注意點:
- 註解方式埋點不支援 private 方法
- 1.6.0 之前的版本 fallback 函式只針對降級異常(
DegradeException
)進行處理,不能針對業務異常進行處理