使用方法:
@RateLimit(max = 3, timeWindow = 10, useUserId = false)
仅需要在需要限流的接口加上注解和需求即可开箱即用,无侵入且快速又简洁。
🧩 一、功能概述
本功能的目标是:限制同一个 IP 地址(或用户 ID)在指定时间内对某个接口的访问次数,超过限制后拒绝请求。
适用于:防止恶意刷接口、接口过载等场景。
🏗️ 二、整体实现原理
-
使用自定义注解
@RateLimit标记需要限流的接口; -
使用 AOP 切面
RateLimitAspect拦截被注解的方法; -
在 Redis 中为每个用户(或 IP)维护一个访问计数器;
-
每次调用接口时,先检查当前计数是否超限;
-
若超限则抛出异常,否则继续执行业务逻辑。
🧱 三、模块详解
📌 1. 自定义注解 @RateLimit
✅ 作用:
定义一个限流注解,用于声明接口的限流规则。
@Target(ElementType.METHOD)
表示:该注解 只能用在方法上,比如控制器的方法、服务类的方法等。
@Retention(RetentionPolicy.RUNTIME)
表示:该注解在 运行时仍然存在,可以通过反射读取它。(因为 AOP 是在运行时通过反射扫描被注解的方法,所以值必须是RetentionPolicy.RUNTIME)
常见取值包括:
| RetentionPolicy | 说明 |
|---|---|
SOURCE |
仅在源码中保留,编译后丢弃,常用于注解提示 |
CLASS |
编译时保留在 .class 文件中,运行时不可见 |
RUNTIME |
运行时仍然存在,可被反射读取 |
📄 示例代码:
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimit {
/**
* 限流 key,默认使用 IP 地址 + 方法路径
*/
String key(

最低0.47元/天 解锁文章
410

被折叠的 条评论
为什么被折叠?



