Sentinel流控规则简介
资源名
唯一名称,默认请求路径。
针对来源
Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
阈值类型
- QPS : 当调用该API的QPS达到单机阈值的时候,进行限流。
- 线程数 : 当调用该API的线程数达到单机阈值的时候,进行限流。
流控模式
- 直接:API达到限流条件时,直接限流。
- 关联:当关联的资源达到阈值时,就限流自己。
- 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流
流控效果
- 快速失败:直接失败,抛异常。
- Warm up:根据Code Factor(冷加载因子,默认3)的值,从阈值/codeFactor,经过指定的预热时长,再到设定的QPS阈值。
- 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。
流控模式测试
QPS+直接+快速失败
规则设置
启动测试
解析思考
我们设置的QPS是1,也就是1秒内同时只能通过一个请求。如果1秒内多于一个请求Sentinel就会对其进行了限流。
线程数+直接
延迟接口时间(修改后重启微服务)
@GetMapping( value = "/testA" )
public String testA(){
try{
Thread.sleep(5000 );
}catch (Exception e){
return "-------testA(error)------";
}
return "-------testA------";
}
规则设置
启动测试
解析思考
我们将/testA接口的处理时间延长到5秒,同时我们设置了对接口/testA接口的线程数直接失败的流控。即这个接口同时只能有一个线程可以访问,其他请求的线程则直接返回被Sentinel限流的提示。
QPS+关联+快速失败
规则设置
启动测试
解析思考
我设置了两个流控规则,对于/testA接口而言,我们通过请求可使其在5秒内处于限流状态。对于接口/testB而言关设置联接口/testA的规则,理论上如果接口/testA被限流,那么/testB也会被限流。
QPS+直接+Warm Up
规则设置
启动测试
解析思考
我们设置了Warm Up并且我们设置了每秒请求数为3,使用Warm Up的规则时是冷启动。即使用默认的冷启动因子3,即在最初时候的QPS为单机阈值除以冷启动因子,即在最初的时候QPS为1,在经过指定预热时长5秒后,才会达到最终的单机阈值3。
QPS+关联+排队等待
规则设置
启动测试
匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。。
解析思考
匀速排队主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们要求系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求,注意匀速排队模式暂时不支持 QPS > 1000 的场景。