关于go:golang-限流中间件

2次阅读

共计 1126 个字符,预计需要花费 3 分钟才能阅读完成。

应用场景为避免并发量忽然增高时,服务器无奈接受,保障了 QPS 的上限值。
次要分为漏桶和令牌桶:

漏桶是指咱们有一个始终装满了水的桶,每过固定的一段时间即向外漏一滴水。如果你接到了这滴水,那么你就能够持续服务申请,如果没有接到,那么就须要期待下一滴水。

令牌桶则是指匀速向桶中增加令牌,服务申请时须要从桶中获取令牌,令牌的数目能够依照须要耗费的资源进行相应的调整。如果没有令牌,能够抉择期待,或者放弃。

package main

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/juju/ratelimit"
)

func RateLimitMiddleware(fillInterval time.Duration, cap, quantum int64) gin.HandlerFunc {bucket := ratelimit.NewBucketWithQuantum(fillInterval, cap, quantum)
    return func(c *gin.Context) {if bucket.TakeAvailable(1) < 1 {c.String(http.StatusForbidden, "rate limit...")
            c.Abort()
            return
        }
        c.Next()}
}

func main() {r := gin.Default()
    gin.ForceConsoleColor()
    r.Use(RateLimitMiddleware(time.Second, 100, 100)) // 初始 100,每秒放出 100
    r.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "golang ~")
    })
    r.Run(":8080")
}

1、认的令牌桶,fillInterval 指每过多长时间向桶里放一个令牌,capacity 是桶的容量,超过桶容量的局部会被间接抛弃。桶初始是满的

func NewBucket(fillInterval time.Duration, capacity int64) *Bucket

2、和一般的 NewBucket() 的区别是,每次向桶中放令牌时,是放 quantum 个令牌,而不是一个令牌。

func NewBucketWithQuantum(fillInterval time.Duration, capacity, quantum int64) *Bucket

3、依照提供的比例,每秒钟填充令牌数。例如 capacity 是 100,而 rate 是 0.1,那么每秒会填充 10 个令牌。

func NewBucketWithRate(rate float64, capacity int64) *Bucket
正文完
 0