今天写了Sentinel自定义限流处理类时发生了各种各样的异常,但最终查找下来都是因为自己的粗心大意才导致犯了错,接下来我就整理一下我自己出现的问题,当然,如果你在controller层直接写了自定义限流处理方法的话,本文也会为你提供思路,供您参考:
最重要也是最基本的细节点:以下所有检错的逻辑都是基于你在Sentinel监控面板对正确的url或者资源名进行流量限制,如果你一开始就对不存在的资源进行了限流,那么报错是理所当然的啦!!!!!

问题一:当我写自定义处理类时没有传入BlockException参数,导致在Sentinel监控面板上面写了限流之后,程序仍然直接在前端页面上抛出异常,没有走我的限流方法

Sentinel底层还是走的try...catch{BlockException exception}finally{...}的逻辑,所以必须要传!
问题二:传入BlockException 参数后,运行项目,添加限流监控,但是访问的url时,异常仍然在前端页面直接抛出...查看代码感觉哪里都很合理(代码如下):
public String excep1(BlockException exception){
return "对不起testA系统发生了异常...请稍后再试";
}
public String excep2(BlockException exception){
return "对不起testB系统发生了异常...请稍后再试";
}出现该问题的原因:是我用的全局BlockHandler.Class处理限流问题的,但是没有在自定义限流方法前面加上static关键字,导致Sentinel底层仍然找不到我的自定义方法...
问题三:我在controller层测试了一个带有参数的情况,因为在使用OpenFeign的服务降级时需要传入参数,所以我就依葫芦画瓢,但是我写下了如下代码,逻辑上仍然没有问题,但是,Sentinel底层不允许

导致前端出现java.lang.reflect.UndeclaredThrowableException异常(代码如下:)
//Controller层代码:
@GetMapping("/testB/{id}")
@SentinelResource(value = "testB",blockHandlerClass = MyhanlderExcep.class,blockHandler = "excep2")
public String testB(@PathVariable Integer id){
return "==========testB";
}
//自定义限流方法的代码:
public static String excep2(BlockException exception, Integer id){
return "对不起testB系统发生了异常...请稍后再试";
}这次是因为什么犯错呢?(参数的位置写反了,底层识别不了...)

最后提醒各位以及自己,敲代码还是要注意细节呀...不然到时候自己找错的时候可麻烦了,因为自己查找会有惯性思维,认为自己写的就是对的...
各位,加油!!!
版权声明:本文为yangdashuai22222原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。