前言
限流有两种策略,漏桶和令牌桶。分别对应两个包:漏桶->https://github.com/uber-go/ratelimit;令牌桶->https://github.com/juju/ratelimit。
原理与使用
gin+令牌桶限流
安装包:go get -u https://github.com/juju/ratelimit
初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import ( "github.com/juju/ratelimit" "time" ) var RateLimit *ratelimit.Bucket func InitRateLimit() { // 参数一:多久生成一个令牌 // 参数二:最多能生成多少令牌 RateLimit = ratelimit.NewBucket(20*time.Second,100) return } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
func RateLimitMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // TakeAvailable: 从令牌桶拿几个可用的令牌 left := rateLimit.RateLimit.TakeAvailable(1) // Available:桶里可用令牌数 /*fmt.Printf("拿到 %d 个token \n",left) fmt.Printf("剩余token %d \n",rateLimit.RateLimit.Available())*/ if left <= 0 { // 如果拿令牌的时候,返回值小于等于0,说明没令牌了 response.Json.SetCode(dist.MessageRateLimit).Ok(c) c.Abort() return } c.Next() } } |