熔断降级
- 对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一;
- 对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩;
- 熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置;
换个通俗的说法,如下
降级:保证主服务,停止其他不是主要的服务;
熔断:当服务调用第二/三方服务出现不可用或超时等情况,为防止系统线程池占满而出现雪崩,暂时对服务停止调用;
Sentinel降级规则
官方文档:[https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7]
- Sentinel 熔断策略
- 慢调用比例 (
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断;- 比例阈值:慢调用统计数对于最小请求数的占有比例;
- 注:比例阈值是Sentinel1.8.x版本的,如果比例阈值修改不生效/降级失败,需要将要将应用中的Sentinel的依赖改到相应的版本;
- 关于Spring Cloud Alibaba 各组件的适配版本,参考:[https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E]
- 比例阈值修改无效,参考:[https://github.com/alibaba/Sentinel/issues/1777]
- 熔断时长:超过时间后会尝试恢复;
- 最小请求数:触发熔断的最小请求数目,若当前统计窗口内的请求数小于此值,即使达到了熔断条件也不会触发;
- 比例阈值:慢调用统计数对于最小请求数的占有比例;
- 慢调用比例 (
-
- 异常比例 (
ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%;
- 异常比例 (
-
-
- 比例阈值:异常数对于最小请求数的占有比例;
- 熔断时长:超过时间后会尝试恢复;
- 最小请求数:熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断;
-
-
- 异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断;
- 异常数 (
-
-
- 异常数:统计的异常数;
- 熔断时长:超过时间后会尝试恢复;
- 最小请求数:熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断;
-
注:注意异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException
)不生效;
服务熔断的三种状态
-
熔断关闭(Closed)
- 服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制;
-
熔断开启(Open)
- 后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法;
-
半熔断(Half-Open)
- 所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率;
如下图:
-
- 熔断恢复:
-
经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态)尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率;
-
如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断状态;
-
- 熔断恢复:
Sentinel自定义异常降级处理
Spring Cloud Alibaba从2.1.0版本到2.2.0版本升级后,Sentinel里面依赖进行了改动,且不向下兼容;
旧版:实现UrlBlockHandler并重写blocked方法;
新版:实现BlockExceptionHandler并重写handle方法;
Sentinel中的异常总类:
Sentinel 限流降级本身的异常 BlockException 限流异常 FlowException 降级异常 DegradeException 参数限流异常 ParamFlowException 系统负载异常 SystemBlockException 授权异常 AuthorityException
Feign整合Sentinel
feign: sentinel: enabled: true