基于Guava的限流实践

基于Guava的限流实践

Guava限流是通过令牌木桶的方法来实现,通俗的讲就是有一个木桶,按照每秒固定的平滑的往这个木桶里面放入令牌,当一个请求到来时会首先去这个木桶里面去拿令牌,当获取到令牌才可以继续执行任务,否则就会一直阻塞,或者其他处理办法

实际中用到的几个Guava的RateLimiter几个方法

  1. RateLimiter create(double permitsPerSecond)
    //其中的permitsPerSecond为每秒往令牌里放入几个立牌
  2. tryAcquire(int permits, long timeout, TimeUnit unit)
    //permits为每次获取多少个令牌,默认为1.timeout设置超时时间,如果在超过这个时间没有获得令牌,就会返回false,默认为0
  3. canAcquire(long nowMicros, long timeoutMicros)
    //判断可以拿到令牌返回为boolean类型,nowMicros为当前时间,timeoutMicros为等待时间,其中tryAcquire方法里面就是同步的调用改方法
  4. acquire(int permits) //获取permits个令牌,返回的是等待时间

实例代码

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        Map<String, RateLimiter> methedToQueue = LimitFlowQueueTool.getQueueTool().getMethedToQueue();//map里面每个接口对应一个限流

        String methedName = request.getRequestURI();
        /*
        判断当前map里面是否存在对应的接口,如果存在调用限流去判断,如果不存在新建一个接口对应限流然后去处理请求
         */
        if (methedToQueue != null && methedToQueue.containsKey(methedName)) {
            dealLimit(request,response,filterChain,methedName,methedToQueue);
        } else {
            methedToQueue.put(methedName, RateLimiter.create(1));
            dealLimit(request,response,filterChain,methedName,methedToQueue);
        }


    }

    public void dealLimit(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain,String methedName,Map<String, RateLimiter> methedToQueue) throws IOException, ServletException {
        RateLimiter rateLimiter = methedToQueue.get(methedName);
        if (rateLimiter != null) {
            if (rateLimiter.tryAcquire(10, TimeUnit.SECONDS)) {
                filterChain.doFilter(request, response);
            } else {
                ResponseBodyTool.ResponseBody(request, response,  new BaseResponse(false,"服务器繁忙"));
            }
        }

    }

该例子使用的是servlet和filter拦截器来实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值