這個描述不嚴謹,并不是“發出的是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枚令牌,實際業務在每次響應請求之前...