这个描述不严谨,并不是“发出的是6枚”,源码里面com.google.common.util.concurrent.SmoothRateLimiter#reserveEarliestAvailable个方法在取令牌时,如果令牌大于0并且小于1的情况下会发生令牌预支付。假如桶内满5个令牌,前5个请求进来,消耗完了这5个令牌,但是这5个请求也是会耗时的,时间会继续往前推,第6个请求进来的时候,桶内令牌数大于0并且小于1(可以看com.google.common.util.concurrent.SmoothRateLimiter#resync这个方法是怎么计算桶内存储的令牌数的),此时发生令牌预支付,并将 nextFreeTicketMicros 向后推,故第6个请求可以接收。
Guava-RateLimiter详解常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前...