refactor(rate-limit): 限流升级为双层滑动窗口,新增 IP 全局限流与响应头

- 新增 IpRateLimitFilter:IP 维度全局滑动窗口限流,所有接口生效(默认 1000 次/60 秒)

- RateLimitAspect 固定窗口升级为滑动窗口(Redis ZSET + Lua),与 IP 全局限流叠加

- 提取公共 SlidingWindowScript,统一 Lua 脚本

- 新增 X-RateLimit-Limit/Remaining/Reset 与 Retry-After 响应头

- RateLimitProperties 新增 ip 配置;新增 RateLimitException;dev 环境关闭 IP 限流
This commit is contained in:
Ray.Hao
2026-07-12 21:23:17 +08:00
parent 2441efa9ba
commit 13ed4503ed
12 changed files with 78 additions and 20 deletions

View File

@@ -15,11 +15,29 @@ import java.util.concurrent.TimeUnit;
@Documented
public @interface RateLimit {
/**
* 窗口内允许的最大请求数。
* <p>
* {@code <=0} 时使用全局默认值 {@code rate-limit.default-limit}。
*/
int limit() default 0;
/**
* 滑动窗口大小。
* <p>
* 单位由 {@link #timeUnit()} 决定;{@code <=0} 时使用全局默认值。
*/
int window() default 0;
/**
* 窗口单位,默认秒。
*/
TimeUnit timeUnit() default TimeUnit.SECONDS;
String prefix() default "rate_limit:";
/**
* 限流 Key 的分组标签,用于区分不同接口。
* <p>
* 默认 {@code api}。
*/
String prefix() default "api";
}