Sentinel主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性,它的工作之一就是熔断降级,所以我们要对Sentinel降级规则进行了解与掌握。(这是我对熔断降级的学习笔记的整理)
什么是熔断降级?
- 对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一
- 我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩
- 熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
Sentinel 提供以下几种熔断策略(官网上找的):
- 慢调用比例 (
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 - 异常比例 (
ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。 - 异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
Sentinel针对降级的名词解释
- 资源名:规则作用对象,默认请求路径
- 降级策略:慢调用比例 异常比例 异常数
- RT:秒级的平均响应时间
- 时间窗口:降级时间间隔,熔断时长,单位为 s
Sentinel的降级
1.对Sentinel-降级策略RT的尝试:
代码片段:
@GetMapping("/testD")
public String testD(){
try {
//暂停线程1秒
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("testD测试 RT");
return "--------testD";
}
测试效果:
对于降级策略RT的理解
平均响应时间RT超出阈值且在时间窗口内通过的请求超出--->
触发降级(断路器打开,这段时间窗口期都不能使用)
---
>
等时间窗口结束后
---->
关闭降级
-->
继续使用
2.对Sentinel-降级策略异常比例的尝试:
代码片段:
@GetMapping("/testE")
public String testE(){
log.info("testE测试 - 异常比例");
int age = 10/0;
return "--------testE";
}
测试效果:
当我们测试刷新页面会出现下面这个错误。,是因为我们异常比例配置时需要QPS
大于5,而正常的刷新达不到这个要求,按照上述配置,单独访问一次,必然来一次报错一次
int age=10/0),
调一次错一次;
所以我们根据异常比例的阐述:
当单位统计时长(
statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
我们直接高并发的发送请求,
多次调用达到我们的配置条件了。断路器开启(保险丝跳
闸),微服务不可用,不再报错Error,
而是服务降级
3.对Sentinel-降级策略异常数的尝试:
代码片段:
@GetMapping("/testF")
public String testF(){
log.info("testF测试 - 异常数");
int age = 10/0;
return "--------testF";
}
测试结果:
对于降级策略异常数的理解:首先它是分钟级的,时间窗口一定要大于等于60秒
异常数(分钟统计)超过阈值
-->
触发降级(断路器打开)
-->
待时间窗口结束
-->
关闭降级 继续使用。
由于统计时间窗口是分钟级别的,若timewindow
小于
60s,
则结束熔断状态后仍可能再进入熔断状态。(已经试过)
最后:
这里写一个设置资源的规则的两种方式,
1.在Sentinel的控制台上面--找到簇点链路的的右上角的列表视图-->进行规则选择配置
2.找不同规则里面的新增