Skip to content

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

License

Notifications You must be signed in to change notification settings

houbb/rate-limit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
binbin.hou
Dec 10, 2022
7679b9e · Dec 10, 2022

History

31 Commits
Aug 5, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Dec 9, 2022
Jul 30, 2018
Jul 30, 2018
Jun 20, 2020
Dec 9, 2022
Jul 30, 2018
Dec 10, 2022
Jun 20, 2020
Dec 9, 2022
Dec 9, 2022
Aug 10, 2018
Jul 30, 2018

Repository files navigation

项目简介

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

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

Maven Central Build Status Open 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 次。

public class UserService {

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

}

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

代码测试

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

@Test(expected = RateLimitRuntimeException.class)
public void limitCountErrorTest() {
    UserService userService = RateLimitProxy.getProxy(new UserService());
    for(int i = 0; i < 3; i++) {
        userService.limitCount();
    }
}

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

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

重复注解 @RateLimits

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

(1)一分钟不超过 10 次

(2)一小时不超过 30 次

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

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

@RateLimits({@RateLimit(interval = 2, count = 5)})
public void limitCount() {
    //...
}

指定引导类

RateLimitProxy.getProxy(new UserService());

等价于

RateLimitProxy.getProxy(new UserService(), 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(new RateLimitMethodService())
      .tokenService(new RateLimitTokenService())
      .rejectListener(new RateLimitRejectListenerException())
      .configService(new RateLimitConfigService())
      .cacheService(new CommonCacheServiceMap())
      .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 注解即可。

@Service
public class UserService {

    private static final Log log = LogFactory.getLog(UserService.class);

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

}

配置

通过 @EnableRateLimit 声明启用限流。

@Configuration
@ComponentScan("com.github.houbb.rate.limit.test.core")
@EnableRateLimit
public class SpringConfig {

}

@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 多注解支持

缓存相关工具

cache: 手写渐进式 redis

common-cache: 通用缓存标准定义

redis-config: 兼容各种常见的 redis 配置模式

lock: 开箱即用的分布式锁

resubmit: 防重复提交

rate-limit: 限流

About

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

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published