Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

🎃Rate limit for java.(java 渐进式限流工具框架,支持 spring springboot 字节码)

License

NotificationsYou must be signed in to change notification settings

houbb/rate-limit

Repository files navigation

rate-limit 是一个为 java 设计的渐进式限流工具。

目的是为了深入学习和使用限流,后续将会持续迭代。

Maven CentralBuild StatusOpen Source Love

特性

  • 渐进式实现

  • 支持独立于 spring 使用

  • 支持整合 spring

  • 支持整合 spring-boot

  • 内置多种限流策略

变更日志

CHANGELOG

快速开始

需求

  • jdk 1.7

  • maven 3.x+

maven 导入

<dependency>    <groupId>com.github.houbb</groupId>    <artifactId>rate-limit-core</artifactId>    <version>1.1.1</version></dependency>

入门例子

方法定义

@RateLimit 限流注解放在方法上,指定对应的限制频率。

也可以定义在类上,默认下面的所有方法生效。方法上的优先级高于类。

属性说明默认值
value方法访问一次消耗的令牌数1
timeUnit时间单位TimeUnit.SECONDS
interval时间间隔60
count可调用次数1000
enable是否启用true

默认为 60S 内,可以调用 1000 次。

publicclassUserService {@RateLimit(interval =2,count =5)publicvoidlimitCount() {log.info("{}",Thread.currentThread().getName());    }}

这个例子中我们 2S 内最多调用 5 次。

代码测试

RateLimitProxy.getProxy(xxx) 通过字节码获取方法对应的方法代理。

@Test(expected =RateLimitRuntimeException.class)publicvoidlimitCountErrorTest() {UserServiceuserService =RateLimitProxy.getProxy(newUserService());for(inti =0;i <3;i++) {userService.limitCount();    }}

当调用超出限制时,默认抛出RateLimitRuntimeException 异常。

这里默认使用的是令牌桶算法,所以会出现异常。

重复注解 @RateLimits

有时候我们希望同时做多个的限制:

(1)一分钟不超过 10 次

(2)一小时不超过 30 次

为了支持多个配置,我们引入了新的注解@RateLimits,可以指定一个@RateLimit 数组。

方法上同时使用@RateLimits +@RateLimit 是可以同时生效的,不过为了简单,一般不建议混合使用。

@RateLimits({@RateLimit(interval =2,count =5)})publicvoidlimitCount() {//...}

指定引导类

RateLimitProxy.getProxy(newUserService());

等价于

RateLimitProxy.getProxy(newUserService(),RateLimitBs.newInstance());

下面我们来一起看一下 RateLimitBs 引导类。

引导类

RateLimitBs 作为引导类,便于用户自定义配置。

方法说明默认值
rateLimit限流策略RateLimits.tokenBucket() 令牌桶算法
timer时间策略Timers.system() 系统时间
cacheService缓存策略CommonCacheServiceMap 基于本地 map 的缓存策略
cacheKeyNamespace缓存KEY命名空间RATE-LIMIT 避免不同的应用,命名冲突。
configService限制配置策略RateLimitConfigService 默认基于方法上的注解
tokenService身份标识策略RateLimitTokenService 默认基于 IP
methodService方法标识策略RateLimitMethodService 默认基于方法名+参数类型
rejectListener拒绝策略RateLimitRejectListenerException 限流时抛出异常

其中 rateLimit 内置RateLimits 工具中的策略如下:

方法说明
fixedWindow()固定窗口
slideWindow(int windowNum)滑动窗口,可指定窗口大小
slideWindow()滑动窗口,默认为 10
slideWindowQueue()滑动窗口,基于队列的实现
leakyBucket()漏桶算法
tokenBucket()令牌桶算法

配置建议

  1. 分布式系统,cacheService 建议使用基于 redis 的集中式缓存策略。

  2. configService 如果想更加灵活,可以基于数据库的配置查询

RateLimitBs 引导类

RateLimitBs 默认配置如下:

RateLimitBs.newInstance()      .timer(Timers.system())      .methodService(newRateLimitMethodService())      .tokenService(newRateLimitTokenService())      .rejectListener(newRateLimitRejectListenerException())      .configService(newRateLimitConfigService())      .cacheService(newCommonCacheServiceMap())      .rateLimit(RateLimits.tokenBucket())      .cacheKeyNamespace(RateLimitConst.DEFAULT_CACHE_KEY_NAMESPACE);

spring 整合

maven 引入

<dependency>    <groupId>com.github.houbb</groupId>    <artifactId>rate-limit-spring</artifactId>    <version>1.1.1</version></dependency>

类定义

方法

和上面使用类似,直接在方法上声明@RateLimit 注解即可。

@ServicepublicclassUserService {privatestaticfinalLoglog =LogFactory.getLog(UserService.class);@RateLimit(interval =2,count =5)publicvoidlimitCount() {log.info("{}",Thread.currentThread().getName());    }}

配置

通过@EnableRateLimit 声明启用限流。

@Configuration@ComponentScan("com.github.houbb.rate.limit.test.core")@EnableRateLimitpublicclassSpringConfig {}

@EnableRateLimit 的属性配置和 RateLimitBs 属性是以一一对应的。

方法说明默认值
rateLimit限流策略令牌桶算法
timer时间策略系统时间
cacheService缓存策略基于本地 map 的缓存策略
cacheKeyNamespace缓存KEY命名空间RATE-LIMIT 避免不同的应用,命名冲突。
configService限制配置策略默认基于方法上的注解
tokenService身份标识策略默认基于 IP
methodService方法标识策略默认基于方法名+参数类型
rejectListener拒绝策略限流时抛出异常

这里的属性值,都是对应的 spring bean 名称,支持用户自定义。

spring-boot 整合

maven 引入

<dependency>    <groupId>com.github.houbb</groupId>    <artifactId>rate-limit-springboot-starter</artifactId>    <version>1.1.1</version></dependency>

使用

其他和 spring 保持一致。

后期 Road-MAP

  • @RateLimit 类级别 public 方法支持

  • @RateLimit 多注解支持

开源矩阵

下面是一些缓存系列的开源矩阵规划。

名称介绍状态
resubmit防止重复提交核心库已开源
rate-limit限流核心库已开源
cache手写渐进式 redis已开源
lock开箱即用的分布式锁已开源
common-cache通用缓存标准定义已开源
redis-config兼容各种常见的 redis 配置模式已开源
quota-server限额限次核心服务待开始
quota-admin限额限次控台待开始
flow-control-server流控核心服务待开始
flow-control-admin流控控台待开始

About

🎃Rate limit for java.(java 渐进式限流工具框架,支持 spring springboot 字节码)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp