思路
- 自定义注解定义限流片段时间和最大请求个数
- 拦截器拦截所有请求,如果发现使用了限流注解的API,查看redis里是否记录了该接口的请求次数,如果有,就判断没有超过自定义注解的最大阈值,达到阈值就拦截该请求,否则请求次数加1并放行
- 使用到redis key自过过期方法,自增量方法
springboot示例代码
- 注解
复制代码
1
2
3
4
5
6
7
8
9
10@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AccessLimit { int seconds() default 1; int maxCount() default 20; }
- 拦截器
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30@Slf4j public class AccessLimitInterceptor implements HandlerInterceptor { @Autowired private RedisUtil redisUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if(handler instanceof HandlerMethod){ HandlerMethod handlerMethod = (HandlerMethod) handler; AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class); if(accessLimit == null) return true; int seconds = accessLimit.seconds(); int maxCount = accessLimit.maxCount(); String url = request.getRequestURI(); String key = RedisKey.accessLimit(url); if(redisUtil.hasKey(key)){ Integer count = redisUtil.get(key); if(count == null) return true; if(count >= maxCount) throw new APIException(APICode.SYSTEM_BUSY); redisUtil.increment(key, 1); }else { redisUtil.set(key, 1, seconds); } } return true; } }
- 配置
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23@Configuration public class WebConfig implements WebMvcConfigurer { @Bean public AccessLimitInterceptor accessLimitInterceptor(){ return new AccessLimitInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registration = registry.addInterceptor(accessLimitInterceptor()); registration.addPathPatterns("/**"); registration.excludePathPatterns( "/", "/**/swagger-resources/**", "/**/*.html", "/**/*.js", "/**/*.css" ); } }
最后
以上就是微笑指甲油最近收集整理的关于redis实现API限流的全部内容,更多相关redis实现API限流内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复