使用 Spring Boot 和 Redis 构建速率限制器和节流层

主要观点:后端 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、添加监控指标等。
阅读 10
0 条评论