• Guava的RateLimiter实现接口限流


    最近开发需求中有需要对后台接口进行限流处理,整理了一下基本使用方法。

    首先添加guava依赖:

        <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>23.0</version>
        </dependency>

    然后封装RateLimiter适用对多接口的限制:

    import com.google.common.util.concurrent.RateLimiter;
    import org.springframework.util.StringUtils;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.TimeUnit;
    
    public class RateLimiterFactory {
    
        private static ConcurrentHashMap<String, RateLimiter> limiterMap = new ConcurrentHashMap<>();
    
        //每秒许可证数量
        private static double permitsPerSecond = 1000;
    
        //等待超时时间
        private static long timeout = 4L;
    
        /**
         *@param apiId 对应接口的id
         *@description 获取许可
         */
        public static boolean tryAcquire(String apiId) {
            //如果传入apiId为空则返回true
            if (StringUtils.isEmpty(apiId)) {
                return true;
            }
            limiterMap.putIfAbsent(apiId, RateLimiter.create(permitsPerSecond));
            return limiterMap.get(apiId).tryAcquire(timeout, TimeUnit.SECONDS);
        }
    
    }

    使用RateLimiterFactory实现对接口的限制:

    @Controller
    public class TestController {
    
        ...
    
        @RequestMapping("/test")
        @ResponseBody
        public String test(){
            if(!RateLimiterFactory.tryAcquire(ApiInfo.TEST)) {
                return "当前请求数过高!";
            }
            ...
        }
    }

    以上就是RateLimiter实现接口限流的常见使用,头一次发文,mark一下。

  • 相关阅读:
    技术笔记3
    技术笔记2 jetty jboss
    技术笔记1前台
    日常笔记4
    日常笔记3
    日常笔记2
    日常笔记
    C语言——结构体
    用Java原子变量的CAS方法实现一个自旋锁
    Java中处理Linux信号量
  • 原文地址:https://www.cnblogs.com/cord/p/9226667.html
Copyright © 2020-2023  润新知