携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
1-7、熔断降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
熔断降级规则说明
熔断降级规则(DegradeRule)包含下面几个重要的属性:
| Field | 说明 | 默认值 |
|---|---|---|
| resource | 资源名,即规则的作用对象 | |
| grade | 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
| count | 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
| timeWindow | 熔断时长,单位为 s | |
| minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
| statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
| slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
1-7-1、熔断策略
熔断策略分为三种,分别为:慢调用比例、异常比例、异常数
1-7-1-1、慢调用比例
慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
1-7-1-1-1、编写测试请求接口
让接口服务每次请求睡眠2s
1-7-1-1-2、设置慢调用熔断规则
在一秒内,请求10次,并且有10%比例的请求数量大于2s,则熔断。
1-7-1-1-3、设置jmeter请求
设置每秒请求20此,这样肯定就能触发熔断规则了
1-7-1-1-4、请求测试
先执行jmeter,运行完成之后,浏览器再次访问接口如下,并且10s内再次访问还是触发降级规则:
10s后再次访问:
第一次:
第二次:
后面的访问就是之前说的经过熔断时长后,服务就会进入半开探测状态,如果第一次依然触发降级规则,则继续进行在设置的实际内熔断,时间过后再次进入半开探测状态。
1-7-1-2、异常比例
异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
1-7-1-2-1、编写测试请求
1-7-1-2-2、设置异常比例熔断规则
服务重启之后,记得先访问一下,控制台即可看到接口
每秒最少请求5次,有5%异常及熔断10s
1-7-1-2-3、设置jmeter请求线程组
设置每秒请求20个线程
1-7-1-2-4、浏览器请求接口
可以看到服务已经降级。
1-7-1-3、异常次数
异常数和异常比例类似,只不过异常数是根据程序发生的异常次数来进行判断的,就不再做演示了。
服务流控一般用在服务提供端,服务降级一般用在服务消费端。
1-8、热点规则(热点参数流控)
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的数据,并对其访问进行限制。
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
1-8-1、添加访问接口
需要注意的是,使用热点规则,必须使用@SentinelResource注解
1-8-2、设置热点规则
单机阈值: 针对所有参数的值进行设置的一个公共的阈值
1-8-2-1、设置热点参数、并额外设置非热点参数
假设当前 参数 大部分的值都是热点流量, 单机阈值就是针对热点流量进行设置, 额外针对普通流量进行参数值流控
比如:商品服务,大部分商品都是经常访问的热点商品,这样单机阈值就可以针对热点流量进行设置,然后额外对一些不是经常访问的商品进行参数流控。
打开簇点链路,找到要设置的接口
设置热点参数的流控规则
保存之后点击编辑,设置非热点参数的规则
通过以下规则,就可以设置当参数值为1的时候,每秒的流控为2
1-8-2-2、设置非热点参数、额外设置热点参数
假设当前 参数 大部分的值都是普通流量, 单机阈值就是针对普通流量进行设置, 额外针对热点流量进行参数值流控
比如:商品服务,大部分商品都是非经常访问的商品,然后开启了一个促销活动,有一些商品就变成了热点商品服务,这样单机阈值就可以针对非热点流量进行设置,然后额外对这些促销商品的商品进行参数流控。
1-8-3、测试热点流控
手动频繁刷新参数为1的时候,就可以复现流控规则
1-8-3-1、使用jmeter测试热点流控
流控规则设置的热点阈值为10;然后非热点参数为1的QPS为2;下面对热点10QPS进行测试,设置一秒访问11次
启动测试可以看到第11次已经被流控
1-9、系统规则
系统规则,一般是用于对系统进行保护,如遇到突发情况,还能保持系统的亚正常运行(有一部分请求会被限制)
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
1-9-1、规则说明
- Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5。
- CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
- 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。