降级规则
基本介绍
- RT:平均响应时间,超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足触发降级,窗口期过后关闭断路器。RT最大4900(更大需要通过-Dcsp.sentinel.statistic.max.rt=xxx才能生效)
- 异常比例(秒级):QPS>=5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
- 异常数(分钟级):异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(超时或异常比例升高),对这个资源进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为抛出异常DegradeException)。
Sentinel的断路器是没有半开状态的,半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。具体可以参考Hystrix
。
降级策略实战
RT
测试:
@GetMapping("/testD")
public String testD()
{
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
log.info("testD 测试RT");
return "------testD";
}
配置规则:
jmeter压测:测试是每秒10个请求数,然后每个请求执行的时候都要1秒,那么1秒内持续进入的前5个请求的平均时间必然大于阈值,RT设置的是200毫秒,所以接下来的时间窗口1秒内,必然服务降级。
运行jmeter
,访问接口:http://localhost:8401/testD
关了jmeter
,访问接口:http://localhost:8401/testD
,可以正常访问了。
要触发这个RT服务降级得满足两个条件:1秒内进入至少5个请求;持续进入的5个请求的平均响应时间大于阈值;
异常比例
简单说:1秒内QPS>=5,异常比例大于阈值,窗口期内,资源降级。
测试:
异常比例必然100%
@GetMapping("/testD")
public String testD()
{
log.info("testD 测试RT");
int age = 10/0;
return "------testD";
}
降级规则配置:
jmeter测试:只循环一次,1秒并发访问10次,每一次访问都是异常,100%的异常比例,必然大于异常比例的阈值
Jmeter执行完后,迅速的访问:
http://localhost:8401/testD
3s窗口期后:请求就能进入到接口里了
异常数
是什么
例:一分钟内,异常数大于5个,就服务熔断降级,时间窗口61秒内访问,都服务降级,时间窗口过去后,才能正常访问
访问接口:http://localhost:8401/testD
这个接口本来就会报错
连续访问5次后,再次访问:服务就被熔断降级了
等待61秒时间窗口过去后,再访问:接口又能访问了
热点参数限流(重点,务必掌握)
是什么
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。
比如:
http://localhost:8401/payment/query?p1 这个接口带有p1热点参数,就限流
http://localhost:8401/payment/query?p2 带p2或者pn 等非热点参数,就不限流
承上启下复习start
源码出处
com.alibaba.csp.sentinel.slots.block.BlockException
测试
假设p1为热点参数
//参数p1对应的索引是0,p2是1
//通过SentinelResource注解指定资源名为testHotKey,不指定的话,默认以接口路径/testHotKey作为资源名
//指定兜底方法deal_testHotKey
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2) {
//int age = 10/0;
return "------testHotKey";
}
//兜底方法
public String deal_testHotKey (String p1, String p2, BlockException exception){
//sentinel的默认提示:Blocked by sentinel(flow limiting)
return "------deal_testHotKey,o(╥﹏╥)o";
}
热点参数规则配
注意这里的统计窗口时长,指的是1秒钟统计一次访问次数,如果1秒钟的访问次数大于阈值,就限流
访问:
1.不带参数,随便访问都是正确的
http://localhost:8401/testHotKey
------testHotKey
2.带参数p1(只要带了都会限)
http://localhost:8401/testHotKey?p1=1
快速访问,会发现一时能正常访问,一时显示的是兜底方法的打印信息 被限流了
注意:p1=1被限流 ,只是p1值为1的时候被限流,p2=2并不会被限流
3.带参数p2
http://localhost:8401/testHotKey?p2=1 怎么访问都是正确的
参数例外项
意思就是当参数的值是指定的值的时候,阈值可以不一样,特殊处理。
这里的是:p1=5时,阈值可以达到200,其他值,阈值为1
测试:http://localhost:8401/testHotKey?p1=5 怎么点都不限流,其他值刷新的快一点,立马就限流。
系统规则
是什么
之前的配置规则,都是针对某个接口,进行限流,是细粒度的。
系统规则是正对整个系统进行限流。
用官方的话说:Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
各项配置参数说明
系统规则支持以下的模式:
- 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 达到阈值即触发系统保护。
配置全局QPS
设置整个系统的1秒请求书为1个
测试:
快速访问/testA接口,会限流
快速访问/testB接口,也会限流