@SentinelResource注解使用详解
作者:互联网
@SentinelResource注解最主要的两个用法:限流控制和熔断降级的具体使用。另外,该注解还有一些其他更精细化的配置,如忽略某些异常的配置,默认降级函数等等。
@SentinelResource属性介绍:
- Value:资源名称,必需项(不能为空)。
- entryType:entry类型,标记流量的方向,取值IN/OUT,可选项(默认为EntryType.OUT)
- blockHandler:处理BlockException的函数名称(可以理解对Sentinel的配置进行方法兜底)。函数要求:
- 必须是public修饰
- 返回类型与原方法一致
- 参数类型需要和原方法相匹配,并在最后加BlockException类型的参数。
- 默认需和原方法在同一个类中,若希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法。
- blockHandlerClass:存放blockHandler的类。对应的处理函数必须是public static修饰,否则无法解析,其他要求:同blockerHandler。
- fallback:用于在抛出异常的时候提供fallback处理逻辑(可以理解为对java异常情况方法兜底)。fallback函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。函数要求:
- 返回类型与原方法一致
- 参数类型需要和原方法相匹配,Sentinel 1.6开始,也可以在方法最后加Throwable类型的参数。
- 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass,并制定fallbackClass里面的方法。
- fallbackClass:存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
- defaultFallback:用于通用的fallback逻辑。默认fallback函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。若同时配置了fallback和defaultFallback,以fallback为准。函数要求:
- 返回类型与原方法一致。
- 方法参数列表为空,或者有一个Throwable类型的参数。
- 默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass,并指定fallbackClass里面的方法。
- exceptionsToIgnore:指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
- exceptionsToTrace:需要trace的异常。
实现限流控制
@RestController public class TestController { @Autowired private TestService testService; @GetMapping("/hello") public String hello() { estService.doSomeThing("hello " + new Date()); return "didispace.com"; } }
启动测试应用,启动Sentinel-Dashboard。发一个请求,可以在Sentinel-Dashboard上看到这个请求的相关信息。
实现限流的异常处理
默认情况下,Sentinel对控制资源的限流处理是直接抛出异常。这样对用户不友好,需要处理一下。
@Slf4j @Service public class TestService { // 限流与阻塞处理 @SentinelResource(value = "doSomeThing", blockHandler = "exceptionHandler") public void doSomeThing(String str) { log.info(str); } public void exceptionHandler(String str, BlockException ex) { log.error("blockHandler:" + str, ex); } // 熔断与降级处理 @SentinelResource(value = "doSomeThing2", fallback = "fallbackHandler") public void doSomeThing2(String str) { log.info(str); throw new RuntimeException("发生异常"); } public void fallbackHandler(String str) { log.error("fallbackHandler:" + str); } }
注意:
- 通过@SentinelResource注解的blockHandler属性制定具体的处理函数。
- 实现处理函数,该函数的传参必须与资源点的传参一样,并且最后加上BlockException异常参数;同时,返回类型也必须一样。
实现熔断降级
@SentinelResource注解除了可以用来做限流控制之外,还能实现与Hystrix类似的熔断降级策略。
@RestController public class TestController { @Autowired private TestService testService; @GetMapping("/hello2") public String hello2() { testService.doSomeThing2("hello2 " + new Date()); return "didispace.com"; } }
@Slf4j @Service public class TestService { // 熔断与降级处理 @SentinelResource(value = "doSomeThing2", fallback = "fallbackHandler") public void doSomeThing2(String str) { log.info(str); throw new RuntimeException("发生异常"); } public void fallbackHandler(String str) { log.error("fallbackHandler:" + str); } }
启动测试应用,启动Sentinel-Dashboard。发一个请求到/hello2接口上,使得Sentinel-Dashboard上可以看到名为doSomeThing2的资源点。然后点击”降级“按钮,为该资源设置降级规则。这里使用异常比例策略,比例设置为0.5(即:50%的异常率),时间窗口设置为2(秒)。
验证熔断降级,根据上面的降级策略配置,当doSomeThing2方法的调用QPS >= 5,如果异常率超过50%,那么后续2秒内的调用将直接出发熔断降级,默认情况会直接抛出DegradeException异常。
标签:降级,String,SentinelResource,详解,str,注解,fallback,异常,public 来源: https://www.cnblogs.com/okeyl/p/16318405.html