零依赖
只用 JDK。没有框架、没有日志实现绑定、没有 JSON 库、没有 Redis 客户端需要排除。
<dependency>
<groupId>io.github.onblog</groupId>
<artifactId>java-limiter</artifactId>
<version>1.0.0</version>
</dependency>implementation 'io.github.onblog:java-limiter:1.0.0'import io.github.onblog.limiter.RateLimiter;
import io.github.onblog.limiter.RateLimiters;
import java.time.Duration;
// 平均每秒 100 次,允许最多 200 次的突发
RateLimiter limiter = RateLimiters.tokenBucket("payments", 200, 100, Duration.ofSeconds(1));
if (limiter.tryAcquire()) {
handleRequest();
} else {
response.setStatus(429);
}被限流不是异常:tryAcquire 返回 false,既不抛异常也不打日志。
| 限流器 | 行为 | 适用场景 |
|---|---|---|
TokenBucketLimiter | 平均速率 + 空闲时累积的突发额度 | 对外 API、保护能容忍突发的下游 |
LeakyBucketLimiter | 严格匀速放行,永不累积突发 | 调用外部接口、MQ 消费等要求平滑的场景 |
SlidingWindowLimiter | 任意滑动窗口内不超过 N 次 | 登录尝试、按分钟/小时计配额且边界不可被利用 |
FixedWindowLimiter | 固定窗口内不超过 N 次,一个 AtomicLong | 流量极高、精度要求宽松 |
WarmUpTokenBucketLimiter | 冷启动时只有 1/3 速率,按预热时长线性爬升 | 刚启动就承载流量的服务 |
ConcurrencyLimiter | 限的是同时在飞数,不是每秒次数 | 保护线程池、连接池、响应慢的下游 |
每种算法怎么实现、并发下保证什么,见算法原理。
The full documentation is also available in English: English.