系列文章:
【Sentinel入门】01 最简单的例子 helloworld
【Sentinel入门】02 @SentinelResource语法(blockHandler、fallback)
【Sentinel入门】03 规则类型对应抛出异常(BlockException、FlowException、ParamFlowException、DegradeException)
【Sentinel入门】04 springmvc 全局统一限流降级结果返回(BlockExceptionHandler接口)
【Sentinel入门】05 springmvc 集成Sentinel & springboot集成Sentinel & 链路模式失效 & WebContextUnify & CommonFilter
规则类型
BlockException包含很多个子类,分别对应不同的场景:
异常 说明
FlowException 限流异常
ParamFlowException 热点参数限流的异常
DegradeException 降级异常
AuthorityException 授权规则异常
SystemBlockException 系统规则异常
blockHandler和blockHandlerClass
-
blockHandler
和blockHandlerClass
组合可以捕获限流的异常FlowException
,FlowException实际上继承了限流异常接口BlockException。常见的用法:
声明一个流控管理:
@SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
public void test() {
System.out.println("Test");
}
回调函数:
public final class ExceptionUtil {
//回调函数的入参是BlockException
public static void handleException(BlockException ex) {
System.out.println("Oops: " + ex.getClass().getCanonicalName());
}
}
当然,FlowException流控异常只是BlockException异常的一个具体子类,还有其他子类,例如DegradeException、AuthorityException、ParamFlowException
可以创建多个规则,共享一个名称,称为一组。都由同一个声明回调函数处理
。如果为了更好的处理这些错误,可以判断具体的异常类型,改造为例如:
public static void handleException(BlockException e) {
if (e instanceof FlowException) {
msg = "请求被限流了";
} else if (e instanceof ParamFlowException) {
msg = "请求被热点参数限流";
} else if (e instanceof DegradeException) {
msg = "请求被降级了";
} else if (e instanceof AuthorityException) {
msg = "没有权限访问";
status = 401;
}
//对msg 做进一步处理,本质上区分具体异常
}
- fallback作用是降级,捕获异常进行处理。