主要观点:后端 API 稳定且已部署到生产环境,但前端错误或恶意请求可能导致服务器过载,所以速率限制很重要。通过 Java + Spring boot、Redis 及 Spring AOP 构建简单可扩展的速率限制器,包括自定义注解、Redis 逻辑、AOP 拦截器、自定义异常处理等,无需第三方库,代码简洁易懂。还介绍了在本地运行 Redis(使用 Docker)及一些扩展和优化的想法,如用用户 ID 替代 IP、添加监控指标等,同时对比了不使用 Spring Cloud Gateway 或 Bucket4j 的原因,强调此方案的透明性、调试便利性等优势,最后给出代码仓库地址。
关键信息:
- 自定义注解
@RateLimit
用于限制控制器方法的访问次数和时间窗口。 RedisRateLimiter
服务与 Redis 交互处理请求计数逻辑。RateLimitAspect
使用 Spring AOP 拦截带有@RateLimit
注解的方法。RateLimitExceedException
自定义异常用于处理速率限制超出的情况。GlobalExceptionHandler
发送 429 响应。- 可在本地通过
docker run --name redis -p 6379:6379 redis
运行 Redis,并在application.properties
中配置相关参数。
重要细节:
@Target(ElementType.METHOD)
限定注解只能用于方法,@Retention(RetentionPolicy.RUNTIME)
使其在运行时可用。RedisRateLimiter
中通过INCR
操作计数,首次命中设置过期时间。- Spring AOP 使速率限制逻辑可复用、集中且透明。
GlobalExceptionHandler
返回 429 响应,更符合 API 规范。- 演示控制器
DemoController
展示了如何使用@RateLimit
注解限制端点访问。 - 可通过不同方式扩展和优化速率限制器,如使用用户 ID、添加监控指标等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。