Guava实现单机限流

968 阅读1分钟

创建SpringBoot项目,引入依赖

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

创建一个Controller

 @Controller
 public class RateController {

        //每一秒只能允许二个请求通过
        RateLimiter rateLimiter = RateLimiter.create(2.0);

        //非阻塞式限流,拿到令牌通过,没有拿到令牌直接返回失败状态
        @GetMapping("/tryAcquire")
        public String tryAcquire() {
            if(rateLimiter.tryAcquire()) {
                return "success";
            }else {
                return "fail";
            }
        }

        //限定时间的非阻塞式限流
        @GetMapping("/tryAcquireWithTimeout")
        public String tryAcquireWithTimeout() {
            //在等待1秒钟还没有获取到令牌就失败
            if(rateLimiter.tryAcquire(1,1, TimeUnit.SECONDS)) {
                return "success";
            }else {
                return "fail";
            }
        }

        //同步阻塞式限流,在没有令牌的时候就等待,不会直接返回,直到拿到令牌为止
        @GetMapping("/acquire")
        public String acquire() {
            rateLimiter.acquire();
            return "success";
        }

  }
  

但是Guava只适用于单机版本的