环境描述,同上一篇文章
sentinel设置blockHandlerClass和blockHandler不生效的坑
目录
1.sentinel的blockHandler和fallback
2.@RestControllerAdvice是否也可以兜底???
总结:二者结果相似,按需自取即可
1.sentinel的blockHandler和fallback
官网关于blockHandler和fallback配置说明极少
最后特别的内容, blockHandler和fallback全部设置,blockHandler和fallback全不设置的情况列举了,但是只设置了fallBack,会不会给限流兜底呢????我猜会,直接上代码
限流的方法,直接抛异常,会直接进入兜底方法。
@RestController
@RequestMapping("/consumer")
@RefreshScope // 刷新自定义配置文件数据
public class ConsumerController {@Resourceprivate ProviderService providerService;@Value("${config.globeInfo}")private String globeInfo;@GetMapping("/test/{name}")@SentinelResource(value = "testBlock", fallbackClass = GlobeHandler.class, defaultFallback = "fallBackHandler")public String test(@PathVariable("name") String name){int a = 10/0;return providerService.test(name) + "~~~~~~ " + globeInfo;}
}
兜底方法:
public class GlobeHandler {public static String fallBackHandler(Throwable e){if(e instanceof BlockException){return "limit异常~~~:" + e.getClass();}return "业务异常~~~~:" + e.getMessage() + "~~~:" + e.getClass();}
}
不做限流设置,进入兜底方法:
增加限制:
结果:
猜想证实了,捕获到了FlowException,也就是说BlockException相关的限流异常都可以捕获。
以此来看,只配置fallBack便可以兜底所有异常。
2.@RestControllerAdvice是否也可以兜底???
1的场景,看着就很像多了几行配置的RestControllerAdvice全局异常处理呢???以下,只配置
RestControllerAdvice看一下效果:
限流方法设置:
@RestController
@RequestMapping("/consumer")
@RefreshScope // 刷新自定义配置文件数据
public class ConsumerController {@Resourceprivate ProviderService providerService;@Value("${config.globeInfo}")private String globeInfo;@GetMapping("/test/{name}")@SentinelResource(value = "testBlock")public String test(@PathVariable("name") String name){int a = 10/0;return providerService.test(name) + "~~~~~~ " + globeInfo;}
}
全局异常处理方法,捕获BlockException和其余Exception
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(BlockException.class)public String BlockException(BlockException e){return "全局异常捕获~~~限流熔断";}@ExceptionHandler(Exception.class)public String ExceptionHandler(Exception exception){if(exception instanceof BlockException){return "全局异常捕获~~~限流熔断66666";}return "全局异常处理:" + exception.getClass() + " message:" + exception.getMessage();}
}
结果,未限流,结果正常:
限流时,出现问题,捕获到异常,但是异常类型为UndeclaredThrowableException:
虽说结果没问题,但是UndeclaredThrowableException是个什么鬼??????
面向百度一下,参考文章:
UndeclaredThrowableException
总结一句话:全局异常处理只能捕获到Error和RuntimeException。So,看了一下BlockException源码,破案了,他的父类是Exception: