从接口限流了解到令牌桶。经过调研,发现 go语言 juju/ratelimit 令牌桶限流器使用比较多,于是研究了下。
具体令牌桶原理,请自行查询资料。
下面给出一个简单应用的例子:
package main
import (
"fmt"
"github.com/juju/ratelimit"
"time"
)
func main() {
b := newBucket(1*time.Second, 100)
for i := 0; i < 1000; i++ {
before := b.Available()
tokenGet := b.TakeAvailable(1)
if tokenGet != 0 {
fmt.Println("获取到令牌 index=", i+1, "前后数量-> 前:", before, ", 后: ", b.Available(), ", tokenGet=", tokenGet)
} else {
fmt.Println("未获取到令牌,拒绝", i+1)
}
time.Sleep(1*time.Millisecond)
}
}
func newBucket(fillInterval time.Duration, capacity int64) *ratelimit.Bucket {
return ratelimit.NewBucketWithQuantum(fillInterval, capacity, capacity)
}