Spring Cloud Alibaba:Sentinel 熔断降级

1. 前言

Sentinel版本:1.8.0

1.8.0 对熔断特性做了大量升级,低于此版本的谨慎参考

2. 熔断策略

2.1 慢调用比例

最大 RT(即最大的响应时间):请求的响应时间大于RT则统计为慢调用。

当单位统计时长(默认1秒)内,请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。

经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

在这里插入图片描述
测试例子:

写一个接口,通过sleep参数来决定是否睡眠1秒。

传 true 则触发睡眠,请求时间 > RT
传 false 则直接返回,请求时间 < RT

    @GetMapping("/order1")
    public String order1(boolean sleep){
    
    
        if (sleep){
    
    
            try {
    
    
                Thread.sleep(1000);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
        return "order1";
    }
  • 在浏览器快速多次打开 /order1?sleep=true ,触发熔断
  • 然后再调用的时候,直接报错 Blocked by Sentinel (flow limiting)
  • 等待几秒,熔断时间过后。如果再次调用 /order1?sleep=true,则又会触发熔断;如果是调用/order1?sleep=false,则结束熔断,恢复正常。

2.2 异常比例

在这里插入图片描述

当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

整个逻辑跟上一步的慢调用比例基本类似,这里就不再画图了

测试例子:

修改上面的接口,通过error判断是否抛出异常

    @GetMapping("/order1")
    public String order1(boolean error) throws Exception {
    
    
        if (error){
    
    
            throw new Exception("抛出异常");
        }
        return "order1";
    }
  • 在浏览器快速访问 /order1?error=true,直到显示Blocked by Sentinel (flow limiting)
  • 静等几秒,熔断时间过后
  • 如果再次调用 /order1?error=true,则又会触发熔断;如果是调用/order1?error=false,则结束熔断,恢复正常。

2.3 异常数

当单位统计时长内异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

3. 注意事项

异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效

猜你喜欢

转载自blog.csdn.net/qq_28834355/article/details/113349838