- Notifications
You must be signed in to change notification settings - Fork6
🎃Rate limit for java.(java 渐进式限流工具框架,支持 spring springboot 字节码)
License
houbb/rate-limit
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
rate-limit 是一个为 java 设计的渐进式限流工具。
目的是为了深入学习和使用限流,后续将会持续迭代。
渐进式实现
支持独立于 spring 使用
支持整合 spring
支持整合 spring-boot
内置多种限流策略
jdk 1.7
maven 3.x+
<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 异常。
这里默认使用的是令牌桶算法,所以会出现异常。
有时候我们希望同时做多个的限制:
(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() | 令牌桶算法 |
分布式系统,cacheService 建议使用基于 redis 的集中式缓存策略。
configService 如果想更加灵活,可以基于数据库的配置查询
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);
<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 名称,支持用户自定义。
<dependency> <groupId>com.github.houbb</groupId> <artifactId>rate-limit-springboot-starter</artifactId> <version>1.1.1</version></dependency>
其他和 spring 保持一致。
@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
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.