Sentinel熔断降级
1、介绍
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 限流降级本身的异常(BlockException)不生效。为了统计异常比例或异常数,需要通过 Tracer.trace(ex) 记录业务异常。示例:
进一步说明
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
熔断有三种状态,分别为OPEN、HALF_OPEN、CLOSED
Hystrix复习
2、降级策略实战
2.1、慢调用比例策列
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6G6COi5L-1669331553551)(image/197、新增熔断规则.png)]](https://file.cfanz.cn/uploads/png/2022/11/25/5/KU02cRRU7d.png)
属性描述
| 属性 | 描述 |
|---|---|
| 最大RT | 需要设置的阈值,超过该值则为慢调用 |
| 比例阈值 | 慢调用所占有的调用比例,范围[0.0,10.] |
| 熔断时长 | 在这段时间内发生熔断、拒绝所有请求,经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态) |
| 最小请求数 | 即允许通过的最小请求数,在该数量内不发生熔断 |
执行逻辑
- 熔断(OPEN):请求数大于最小请求数并且慢调用的比率大于比例阈值则发生熔断,熔断时长为用户自定义设置。
- 探测(HALFOPEN):当熔断过了定义的熔断时长,状态由熔断(OPEN)变为探测(HALFOPEN)。
注意Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置
添加控制器
请求线程睡眠一秒方便后面的压测测试
@GetMapping("/testD")
public String testD()
{
//暂停几秒钟线程
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
log.info("testD 测试RT");
return "------testD";
}
JMeter压测
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z986ir0f-1669331553552)(image/198、启动测试.png)]](https://file.cfanz.cn/uploads/png/2022/11/25/5/0cK3C00G4O.png)
在上面的测试中在通过访问:http://localhost:8401/testD发现会出现如下错误,因为被熔断了,当停止压测再请求又可以了
Blocked by Sentinel (flow limiting)
2.2、异常比例
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytpvB6bZ-1669331553552)(image/199、异常比例.png)]](https://file.cfanz.cn/uploads/png/2022/11/25/5/fC8N6b1O1L.png)
解读
统计最近1000ms内的所有请求,如果请求量超过5次,并且异常比例不低于0.4,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行异常请求做测试
修改业务代码报错
@GetMapping("/testD")
public String testD()
{
//暂停几秒钟线程
//try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
// log.info("testD 测试RT");
int a = 1/0;
log.info("testD 异常比例数触发熔断");
return "------testD";
}
启动测试刷新后台报出异常,然后进入熔断输出内容
Blocked by Sentinel (flow limiting)
2.3、异常数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhcWofrX-1669331553553)(image/200、异常数.png)]](https://file.cfanz.cn/uploads/png/2022/11/25/5/ad1OQ1B59d.png)










