Sentinel流控规则简介

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_微服务

资源名

唯一名称,默认请求路径。

针对来源

Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。

阈值类型

  • QPS : 当调用该API的QPS达到单机阈值的时候,进行限流。
  • 线程数 : 当调用该API的线程数达到单机阈值的时候,进行限流。

流控模式

  • 直接:API达到限流条件时,直接限流。
  • 关联:当关联的资源达到阈值时,就限流自己。
  • 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流

流控效果

  • 快速失败:直接失败,抛异常。
  • Warm up:根据Code Factor(冷加载因子,默认3)的值,从阈值/codeFactor,经过指定的预热时长,再到设定的QPS阈值。
  • 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。

流控模式测试

QPS+直接+快速失败

规则设置

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_java_02

启动测试

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_微服务_03

解析思考

我们设置的QPS是1,也就是1秒内同时只能通过一个请求。如果1秒内多于一个请求Sentinel就会对其进行了限流。

线程数+直接

延迟接口时间(修改后重启微服务)

@GetMapping( value = "/testA" )
public String testA(){
    try{
        Thread.sleep(5000 );
    }catch (Exception e){
        return "-------testA(error)------";
    }
    return "-------testA------";
}

规则设置

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_spring cloud_04

启动测试

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_微服务_05

解析思考

我们将/testA接口的处理时间延长到5秒,同时我们设置了对接口/testA接口的线程数直接失败的流控。即这个接口同时只能有一个线程可以访问,其他请求的线程则直接返回被Sentinel限流的提示。

QPS+关联+快速失败

规则设置

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_spring cloud_06


spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_java_07

启动测试

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_spring cloud_08

解析思考

我设置了两个流控规则,对于/testA接口而言,我们通过请求可使其在5秒内处于限流状态。对于接口/testB而言关设置联接口/testA的规则,理论上如果接口/testA被限流,那么/testB也会被限流。

QPS+直接+Warm Up

规则设置

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_微服务_09

启动测试

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_spring cloud_10

解析思考

我们设置了Warm Up并且我们设置了每秒请求数为3,使用Warm Up的规则时是冷启动。即使用默认的冷启动因子3,即在最初时候的QPS为单机阈值除以冷启动因子,即在最初的时候QPS为1,在经过指定预热时长5秒后,才会达到最终的单机阈值3。

QPS+关联+排队等待

规则设置

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_java_11

启动测试

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。。

spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_spring cloud_12


spring cloud gateway 集成sentinel 限流降级 springcloud限流算法_java_13

解析思考

匀速排队主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们要求系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求,注意匀速排队模式暂时不支持 QPS > 1000 的场景。