赞
踩
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>
注意:注解方式埋点不支持 private 方法。
@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:
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 接入的 Sentinel,则无需额外进行配置即可使用 @SentinelResource 注解。
若您的应用使用了 Spring AOP(无论是 Spring Boot 还是传统 Spring 应用),您需要通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean:
- @Configuration
- public class SentinelAspectConfiguration {
-
- @Bean
- public SentinelResourceAspect sentinelResourceAspect() {
- return new SentinelResourceAspect();
- }
- }
我们提供了 Spring AOP 的示例,可以参见 sentinel-demo-annotation-spring-aop。
若您的应用直接使用了 AspectJ,那么您需要在 aop.xml 文件中引入对应的 Aspect:
- <aspects>
- <aspect name="com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect"/>
- </aspects>
若注解方式埋点不生效,请排查:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。