Guava RateLimiter 单体应用限流

丢弃行为限流


@Slf4j
public class GuavaRateLimiterExample {
  // 每秒令牌数
  static double permitsPerSecond = 5;
  static RateLimiter rateLimiter = RateLimiter.create(permitsPerSecond);

  public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < 100; i++) {
      Thread.sleep(100);
      if (rateLimiter.tryAcquire()) {
          //等待时间要多余令牌生成时间,否则等不到令牌 
        // if (rateLimiter.tryAcquire(210, TimeUnit.MILLISECONDS)) {//等到示例
        // if (rateLimiter.tryAcquire(150, TimeUnit.MILLISECONDS)) {//等不到示例
        handle(i);
      }
    }
  }

  private static void handle(int i) {
    log.info("index - {}", i);
  }
}

guavalimiter

阻塞行为限流

@Slf4j
public class GuavaRateLimiterExample2 {
  // 每秒令牌数
  static double permitsPerSecond = 5;
  static RateLimiter rateLimiter = RateLimiter.create(permitsPerSecond);

  public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < 100; i++) {
      Thread.sleep(100);
      rateLimiter.acquire(5); // 默认拿1个令牌: 拿到5个令牌才去处理
      handle(i);
    }
  }

  private static void handle(int i) {
    log.info("index - {}", i);
  }
}

blockguavalimiter