当前位置: 首页 > 科技观察

如何使用@SentinelResource注解?请看一下!

时间:2023-03-15 21:53:04 科技观察

大家好,我是Milo。今天就带大家了解一下如何在Sentinel中使用@SentinelResource注解。本文主要介绍以下内容@SentinelResource注解注解简介注解使用@SentinelResource注解注意:注解方法嵌入不支持私有方法。注解介绍@SentinelResource用于定义资源,提供可选的异常处理和回退配置项。@SentinelResource注解包含以下属性:1.value:资源名称,必填(不能为空)2.entryType:入口类型,可选(默认为EntryType.OUT)3.blockHandler/blockHandlerClass:blockHandler对应的名称处理BlockException的函数,可选。blockHandler函数的访问范围需要是public,返回类型需要和原方法匹配,参数类型需要和原方法匹配,最后多加一个参数,类型为BlockException。默认情况下,blockHandler函数需要与原始方法在同一个类中。如果要使用其他类的功能,可以将blockHandlerClass指定为对应类的Class对象。注意对应的函数必须是静态函数,否则无法解析。4.fallback/fallbackClass:回退函数名,可选,用于提供异常抛出时的回退处理逻辑。fallback函数可以处理所有类型的异常(exceptionsToIgnore中排除的异常类型除外)。回退函数签名及位置要求:返回值类型必须与原函数的返回值类型一致;方法参数列表必须和原函数保持一致,或者增加一个Throwable类型的参数来接收相应的异常。默认情况下,回退函数需要与原始方法在同一个类中。如果要使用其他类的功能,可以将fallbackClass指定为对应类的Class对象。注意对应的函数必须是静态函数,否则无法解析。5.defaultFallback(since1.6.0):默认回退函数名,可选,通常用于一般的回退逻辑(即可以用于很多服务或方法)。默认的回退函数可以处理所有类型的异常(exceptionsToIgnore中排除的异常类型除外)。如果同时配置了fallback和defaultFallback,则只有fallback生效。defaultFallback函数签名要求:返回值类型必须与原函数的返回值类型相同;方法参数列表需要为空,或者可以额外增加一个Throwable类型的参数来接收相应的异常。默认情况下,defaultFallback函数需要与原始方法在同一个类中。如果要使用其他类的功能,可以将fallbackClass指定为对应类的Class对象。注意对应的函数必须是静态函数,否则无法解析。5.exceptionsToIgnore(since1.6.0):用于指定排除哪些异常,不计入异常统计,不进入fallback逻辑,原样抛出。从1.8.0版本开始,defaultFallback支持类级别的配置。注意:1.6.0之前版本的fallback函数只处理DegradeExceptions,不处理业务异常。特别的,如果同时配置了blockHandler和fallback,当限流降级抛出BlockException时,只会进入blockHandler的处理逻辑。如果没有配置blockHandler、fallback和defaultFallback,降流时会直接抛出BlockException(如果方法本身没有定义throwsBlockException,会被JVM用UndeclaredThrowableException包装)。注解使用代码编写代码结构SentinelController/***注解@SentinelResource学习*@authorMiloLee*@date2021-03-2311:33*/@RestControllerpublicclassSentinelController{@AutowiredprivateISentinelServiceservice;@GetMapping(value="/hello/{s}")publicStringapiHello(@PathVariablelongs){returnservice.hello(s);}}ISentinelService/***@authorMiloLee*@date2021-03-2311:34*/publicinterfaceISentinelService{Stringhello(longs);}SentinelServiceImpl/***@authorMiloLee*@date2021-03-2311:34*/@Service@Slf4jpublicclassSentinelServiceImplimplementsISentinelService{/***Sentinel提供@SentinelResource注解用于定义资源*@params*@return*/@Override//value:资源名称,必填(不能为空)//blockHandler对应BlockException的函数名//fallback用于提供异常抛出时的回退处理逻辑@SentinelResource(value="hello",blockHandler="exceptionHandler",fallback="helloFallback")publicStringhello(longs){日志错误r("hello:{}",s);returnString.format("Helloat%d",s);}//回退函数,函数签名与原函数一致或增加一个Throwable类型的参数.publicStringhelloFallback(longs){log.error("helloFallback:{}",s);returnString.format("Haloooo%d",s);}//块异常处理函数,最后一个参数是BlockException,其余参数与原函数相同Consistent.publicStringexceptionHandler(longs,BlockExceptionex){//Dosomeloghere.log.error("exceptionHandler:{}",s);ex.printStackTrace();return"Oops,erroroccurredat"+s;}}启动我们的项目,访问我们的测试方法(刷新几次,进入控制面板)限流测试现在我们为我们的资源配置一个流量控制规则:你好,配置步骤如下图所示,配置为successful:回到我们的页面,快速刷新页面,我们会发现偶尔会显示如下信息,说明我们配置的流控规则已经成功拦截控制台日志:根据我们上面的研究,如果我们的QPS超出配置,代码将抛出BlockException。为什么代码中会出现FlowException?通过查看源码,我们会发现FlowException其实是BlockException的子类。经过以上测试,我们发现注解开发已经成功,并进行了限流和降级测试。在降级测试之前,我们需要修改我们的代码:@SentinelResource(value="hello",afterblockHandler="exceptionHandler",fallback="helloFallback"):@SentinelResource(value="hello",fallback="helloFallback")配置流控规则配置降级规则:测试方法是根据我们配置的规则,如果qps>1,肯定会触发BlockException。此时降级规则判断异常比例超过请求数的20%,会自动触发降级😛我的点击率:匀速---转---快😂大家在这里观察在日志中,我第一次匀速点击的时候,并没有进入helloFallback方法。当我快速点击的时候,进入了helloFallback方法,说明此时降级规则生效,触发降级,进入回调函数helloFallback;今天的分享到此结束,谢谢大家