令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

RateLimiter

  1. RateLimiter rateLimiter = RateLimiter.create(3);
  2. rateLimiter.acquire();
  3. //判断能否在1秒内得到令牌,如果不能则立即返回false,不会阻塞程序
  4. if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
  5. logger.info("短期无法获取令牌,真不幸,排队也瞎排");
  6. }

rateLimiter.acquire()该方法会阻塞线程,直到令牌桶中能取到令牌为止才继续向下执行,并返回等待的时间。