方法级QPS限制

概述

通常来说系统能正确处理的请求数量是有限的,大规模流量的突增往往会超出系统的能力范围,压垮整个系统。Service Keeper提供了方法级的限流功能,对超过QPS阈值的调用直接降级或抛出RateLimitOverflowException异常。使用时,可以自定义限流周期以及周期内流量阈值。

Note
  1. QPS阈值支持通过本地配置文件动态更新,实时生效。
  2. 对于QPS超过限制的方法调用,如果原始方法正确配置了降级方法则执行该方法,否则抛出RateLimitOverFlowException

使用示例

@RequestMapping("/list")
@ResponseBody
@RateLimiter(limitForPeriod = 500, limitRefreshPeriod = "10m")
public Employee list() {
    return new Employee("LiMing", 25, "1403063");
}

如上配置表示该方法每10分钟内最多允许500次调用,对于超过该限制的方法调用直接抛出RateLimitOverFlowException

对该注解的属性说明如下:

属性名称 类型 描述 默认值 备注 是否支持动态配置
limitForPeriod int 周期内流量阈值  
limitRefreshPeriod String 周期时间 1s  
Note

如果配置文件中存在该方法的@RateLimiter注解中的同名配置则配置文件中的优先级更高。

注解配置简化

@RequestMapping("/list")
@ResponseBody
@RateLimiter(500) //表示 limitForPeriod 为 500,limitRefreshPeriod为默认值
public Employee list() {
    return new Employee("LiMing", 25, "1403063");
}

配置文件配置

如前文所述,只要原始方法可以被ServiceKeeper拦截到,你可以不使用@RateLimiter注解,直接在配置文件中配限流规则即可完成对原始方法的QPS限制。示例如下:

#周期内QPS阈值为500
io.esastack.servicekeeper.demo.QpsLimitDemo.demoMethod.limitForPeriod=500

#限流周期每10分钟更新一次,单位为:ms(毫秒)、s(秒)、m(分钟)等
io.esastack.servicekeeper.demo.QpsLimitDemo.demoMethod.limitRefreshPeriod=10m

其中,io.esastack.servicekeeper.demo.QpsLimitDemo.demoMethod为原始方法的名称(类全限定名+方法名)。

Note

通过配置文件配置限流规则时周期内流量阈值 limitForPeriod为必需配置,限流周期limitRefreshPeriod如不配置默认为1s。

动态更新参数限制

并不是所有的参数都支持动态更新,其中支持动态更新的参数项:动态参数配置项