集成Guava令牌桶实现全局限流功能
2020-08-26 本文已影响0人
寂静的春天1988
1、在pom中引入Guava工具包的支持
2、定义一个拦截器,实现令牌的发送和收取
3、将拦截器,配置到web系统中
<!-- Guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
/**
* 全局限流拦截器
* @author user
*
*/
@Slf4j
@Component
public class RateLimitInterceptor implements HandlerInterceptor {
/**
* 限流器(每秒1次)
*/
private static final RateLimiter RATE_LIMITER=RateLimiter.create(1);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if(!RATE_LIMITER.tryAcquire()) {
log.info("已被限流");
throw new RuntimeException("限流异常");
}
return true;
}
}
@Configuration
@EnableWebMvc
@Slf4j
public class WebConfig implements WebMvcConfigurer {
@Resource
private RateLimitInterceptor rateLimitInterceptor;
/**
* 添加拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* 将api开头的请求路径限流
*/
registry.addInterceptor(rateLimitInterceptor)
.addPathPatterns("/api/**");
}
/**
* 静态资源配置,这里的将不会进入拦截器
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
}
该方案只能支持单节点限流,如果是分布式项目,需要用redis的方式实现限流功能。