Sentinel(十八)之注解支持
轉載自??注解支持
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>@SentinelResource 注解
注意:注解方式埋點不支持 private 方法。
@SentinelResource?用于定義資源,并提供可選的異常處理和 fallback 配置項。?@SentinelResource?注解包含以下屬性:
- 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 函數簽名要求:
- 返回值類型必須與原函數返回值類型一致;
- 方法參數列表需要為空,或者可以額外多一個?Throwable?類型的參數用于接收對應的異常。
- defaultFallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定?fallbackClass?為對應的類的?Class?對象,注意對應的函數必需為 static 函數,否則無法解析。
- exceptionsToIgnore(since 1.6.0):用于指定哪些異常被排除掉,不會計入異常統計中,也不會進入 fallback 邏輯中,而是會原樣拋出。
1.8.0 版本開始,defaultFallback?支持在類級別進行配置。
注:1.6.0 之前的版本 fallback 函數只針對降級異常(DegradeException)進行處理,不能針對業務異常進行處理。
特別地,若 blockHandler 和 fallback 都進行了配置,則被限流降級而拋出?BlockException?時只會進入?blockHandler?處理邏輯。若未配置?blockHandler、fallback?和?defaultFallback,則被限流降級時會將?BlockException?直接拋出(若方法本身未定義 throws BlockException 則會被 JVM 包裝一層?UndeclaredThrowableException)。
示例:
public class TestService {// 原函數@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")public String hello(long s) {return String.format("Hello at %d", s);}// Fallback 函數,函數簽名與原函數一致或加一個 Throwable 類型的參數.public String helloFallback(long s) {return String.format("Halooooo %d", s);}// Block 異常處理函數,參數最后多一個 BlockException,其余與原函數一致.public String exceptionHandler(long s, BlockException ex) {// Do some log here.ex.printStackTrace();return "Oops, error occurred at " + s;}// 這里單獨演示 blockHandlerClass 的配置.// 對應的 `handleException` 函數需要位于 `ExceptionUtil` 類中,并且必須為 public static 函數.@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})public void test() {System.out.println("Test");} }從 1.4.0 版本開始,注解方式定義資源支持自動統計業務異常,無需手動調用?Tracer.trace(ex)?來記錄業務異常。Sentinel 1.4.0 以前的版本需要自行調用?Tracer.trace(ex)?來記錄業務異常。
配置
Spring Cloud Alibaba
若您是通過?Spring Cloud Alibaba?接入的 Sentinel,則無需額外進行配置即可使用?@SentinelResource?注解。
Spring AOP
若您的應用使用了 Spring AOP(無論是 Spring Boot 還是傳統 Spring 應用),您需要通過配置的方式將?SentinelResourceAspect?注冊為一個 Spring Bean:
@Configuration public class SentinelAspectConfiguration {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();} }我們提供了 Spring AOP 的示例,可以參見?sentinel-demo-annotation-spring-aop。
AspectJ
若您的應用直接使用了 AspectJ,那么您需要在?aop.xml?文件中引入對應的 Aspect:
<aspects><aspect name="com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect"/> </aspects>總結
以上是生活随笔為你收集整理的Sentinel(十八)之注解支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 俄罗斯探月发射最新时间表:月球 26 号
- 下一篇: 家庭电脑配置推荐价位(家庭 电脑 配置)