SpringCloud Alibaba 入坑(六),java 开发程序员面试题
@SentinelResource 的源码
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SentinelResource {
String value() default "";
EntryType entryType() default EntryType.OUT;
String blockHandler() default "";
Class<?>[] blockHandlerClass() default {};
String fallback() default "";
Class<? extends Throwable>[] exceptionsToTrace() default {Throwable.class};
}
@SentinelResource 的属性
value 资源名称
entryType entry 类型,有 IN、OUT 两种
blockHandler 限流处理方法
blockHandlerClass 限流处理类
fallback 熔断降级处理方法
fallbackClass 熔断降级处理类
exceptionsToTrace 异常跟踪列表
==================================================================
![](https://static001.geekbang.org/infoq/aa/aa3d02deff6702e984ca9d9b51ea1803.png)
前面出现限流情况后,都会出现一样的错误信息,那么我们是否能定义一个自己的限流处理方法呢?
在
@Slf4j
@RestController
@RequestMapping("provider")
public class GoodsController {
@GetMapping("goods")
@SentinelResource(value = "goods",blockHandler = "findGoodsExceptionHandler")
public String findGoods(){
log.info("正常返回商品");
return "正常返回商品";
}
public String findGoodsExceptionHandler(BlockException ex){
log.error("出现限流",ex);
return "出现限流";
}
blockHandler 属性指定限流处理的方法名,默认情况下该方法必须定义在当前类中,而且参数和返回值和原方法一致,可以多定义一个 BlockException 参数代表限流异常。
如果不希望处理方法和原方法耦合在一起,可以单独定义处理类,处理方法必须是静态的。
@Slf4j
public class MyBlockHandler {
public static String findGoodsExceptionHandler(BlockException ex){
log.error("出现限流",ex);
return "出现限流";
}
}
然后 @SentinelResource 加上属性
blockHandlerClass = MyBlockHandler.class
配置限流规则
![](https://static001.geekbang.org/infoq/90/9053ea3f9ea4f96e88b55d34a3db50aa.png)
出现限流后,调用的是自定义方法
![](https://static001.geekbang.org/infoq/53/539f9627c2abc847ff898d56e6a254c3.png)
==================================================================
通过 fallback 属性指定降级方法,降级方法必须在同一个类中,返回值和参数和原方法一致
@Slf4j
@R
estController
@RequestMapping("provider")
public class GoodsController {
@GetMapping("goods")
@SentinelResource(value = "goods",fallback = "findGoodsFallback")
评论