学习@SentinelResource注解,如何处理限流后的请求?如何处理资源方法发生异常后的事情?
本章代码已分享至Gitee: https://gitee.com/lengcz/springcloudalibaba01.git
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SentinelResource {
String value() default "";
EntryType entryType() default EntryType.OUT;
int resourceType() default 0;
String blockHandler() default "";
Class<?>[] blockHandlerClass() default {};
String fallback() default "";
String defaultFallback() default "";
Class<?>[] fallbackClass() default {};
Class<? extends Throwable>[] exceptionsToTrace() default {Throwable.class};
Class<? extends Throwable>[] exceptionsToIgnore() default {};
}
@Service
@Slf4j
public class MySourceServiceImpl {
/**
* 定义一个资源
* 定义当资源内部发生异常的时候的处理逻辑
* blockHandler 定义当资源内部发生了BlockException应该进入的方法,捕获的是Sentinel定义的异常
* fallback 定义当资源内部发生了Throwable应该进入的方法
* @param name
* @return
*/
@SentinelResource(value="findById",blockHandler = "blockHandler11",fallback = "fallback2")//定义资源
public String findById(String name){
log.info("查询处理");
return "abc";
}
/**
* blockHanler要求
* 1. 当前方法的返回值和参数必须与原方法保持一致
* 2. 允许在参数列表的最后加入一个参数BlockException,用来接受原方法中发生的异常
* @param name
* @param e
* @return
*/
public String blockHandler11(String name, BlockException e){
log.error("发生BlockException时,被运行了");
return "BlockException";
}
/**
* fallback2
* 1. 当前方法的返回值和参数必须与原方法保持一致
* 2. 允许在参数列表的最后加入一个参数Throwable,用来接受原方法中发生的异常
* @param name
* @param e
* @return
*/
public String fallback2(String name, Throwable e){
log.error("发生Throwable时,被运行了");
return "Throwable";
}
}
启动服务器测试,并设置流控规则

频繁请求接口,发现因为限流进入了blockHandler 设定的方法。也就是说因为限流规则,不能进入资源方法内时,请求会进入到blockHandler定义的方法。


把blockHandler对应的方法去掉,再次执行时,限制流后进入fallback指定的方法


如果资源方法内发生异常,也会之间进入fallback方法内

通过源码,可以发现@SentinelResource包含了blockHandlerClass和fallbackClass方法
,怎么使用呢?


blockHandlerClass和fallbackClass其实与第二节的内容一样,只不过声明blockHandlerClass和fallbackClass可以把blockHandler方和fallback方法单独声明在外部的类里面。
与fallback使用一致。默认使用fallback处理,同时配置defaultFallback和fallback时,以fallback为准。
defaultFallback作为默认通用的处理逻辑。