集成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的方式实现限流功能。

上一篇 下一篇

猜你喜欢

热点阅读