API安全机制之使用Guava实现简易限流

流控-流量控制

负载均衡

反向代理
API安全机制之使用Guava实现简易限流_第1张图片

使用Guava下的ratelimit令牌桶简易实现限流效果

@Component
public class RateLimitFilter extends OncePerRequestFilter {

		//每秒只发送一个令牌
    private RateLimiter rateLimiter=RateLimiter.create(1);

    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
    		//尝试获取令牌
        if(rateLimiter.tryAcquire()){
            filterChain.doFilter(httpServletRequest,httpServletResponse);
        }
        else{
            httpServletResponse.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            httpServletResponse.getWriter().write("to many request");
            httpServletResponse.getWriter().flush();
        }
    }
}

注:常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌,只有取到令牌的请求才会被成功响应,获取的方式有两种:阻塞等待令牌或者取不到立即返回失败。

你可能感兴趣的:(微服务安全实战,API安全机制)