Sentinel 的熔断机制支持三种策略:0-慢调用比例、1-异常比例、2-异常笔数
熔断功能测试对应的Controller 如下所示
// 熔断
// http://localhost:8880/test/degrade
@SuppressWarnings("static-access")
@SentinelResource(value = "degradeResource", blockHandler = "degradeBlockHandler", fallback = "degradeFallback")
@RequestMapping("/degrade")
@ResponseBody
public String degrade(@RequestBody String request) throws InterruptedException {
Thread.currentThread().sleep(25); // 模拟慢响应
System.out.println(request);
return "This is Degrade Page";
}
// 返回值类型必须与原函数返回值类型一致;
// 方法参数列表需要和原函数一致,或者可以额外多一个 BlockException 类型的参数用于接收对应的异常。
public String degradeBlockHandler(@RequestBody String request, BlockException ex) {
return "degradeBlockHandler";
}
// 返回值类型必须与原函数返回值类型一致;
// 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
public String degradeFallback(@RequestBody String request, Throwable throwable) {
return "degradeFallback";
}
yml 熔断规则配置如下
sentinel:
degrade:
rules: "[{'resource':'degradeResource', 'grade':'0', 'minRequestAmount':'3', 'count':'20', 'timeWindow':'20', 'statIntervalMs':'10000'}]"
该条规则的解释为
- grade=0表示按照慢调用比例策略熔断
- minRequestAmount=3表示请求数超过3之后才可能触发熔断
- count=20表示超过20ms 的识别为慢响应
- timeWindow=20表示熔断时长为20s
- statIntervalMs表示统计窗口长度为10000ms
使用Postman 发起请求,请求到第四次的时候就满足了上面配置的慢调用的规则,触发blockHandler = “degradeBlockHandler” 的回调
fallback 功能测试
Sentinel 支持通过@SentinelResource 注解定义资源并配置blockHandler 和fallback 函数来进行限流之后的处理。注意blockHandler 函数会在原方法被限流/降级/系统保护的时候调用,而fallback 函数会针对所有类型的异常
如果把degrade 姐哦哭修改为如下方式,无脑抛出一个自定义异常
// 熔断
// http://localhost:8880/test/degrade
@SentinelResource(value = "degradeResource", blockHandler = "degradeBlockHandler", fallback = "degradeFallback")
@RequestMapping("/degrade")
@ResponseBody
public String degrade(@RequestBody String request) throws InterruptedException {
throw new ExceptionMain();
}
使用Postman 发起一次请求,就会导致触发fallback = “degradeFallback” 的回调