Administrator
Administrator
发布于 2026-01-20 / 18 阅读
0
0

限流防抖实现解析

限流使用AOP的原因

限流既可以用拦截器做,也可以用AOP做。但是使用AOP更加贴近方法级能力,而拦截器更贴近HTTP请求级能力(也可说是Controller调用链级能力)。具体来说,拦截器贴近的是“一次请求”这个维度,而不是“某个 Java 方法”这个维度。

声明注解

编写限流注解类RateLimit,通过@Target(ElementType.METHOD)限定注解使用位置为方法、@Retention(RetentionPolicy.RUNTIME)限定注解保留阶段是运行时。

编写限流执行规则

通过@Around匹配切点表达式,当每次HTTP请求发来的时候,Spring MVC就会从容器里拿到那个Controller Bean(实际上是AOP代理),Spring AOP代理会让@Around通知包裹住目标方法的整个执行过程。

在切面执行规则里,通过org.springframework.web.context.request.ServletRequestAttributes在非Controller的地方拿到request/response,靠着从request里获取的接口路径、注解中的参数生成限流key,借助Redis判断当前请求是否限流,未达上限使用org.aspectj.lang.ProceedingJoinPoint.proceed()放行,达到上限则不放行,但不放行需提前写好response的status、contentType、响应内容。


评论