阐明
在日常网站的经营过程种,当并发数达到咱们服务的阈值的时候,咱们能够通过限流的形式保障服务可用性。
常见的限流办法:
1. 应用带缓冲的 chann,当 chan 塞满当前,拒绝服务或者给一个敌对的提醒或跳转到一个敌对的页面等。
2. 计数器,在 10 秒内只承受 100 申请,当超过 100 申请后,拒绝服务,当超过 10 秒后,计数归零,从新承受申请。
3. 应用 httpserver 的频率限度,无需本人实现。
4. 令牌桶算法:以恒定的速度往令牌桶中放入令牌,当有申请过去则从令牌桶中获取令牌进行后续申请,当获取令牌失败后则进行敌对解决。
5. 漏桶算法:申请先进入到漏桶里,而漏桶以固定的速率解决申请,当申请数量超过漏桶的容量时,将超出的申请进行敌对解决,不适宜突发申请场景。
下面两种令牌的算法区别:漏桶算法,可能强行限度传输速率,令牌桶算法:可能限度均匀传输速率,容许某种突发状况。
GS Admin 限流形式
GS Admin 采纳 golang 外部有一个十分好用的限流器 time/rate 位于 golang.org/x/time/rate 具体的用法能够产靠官网文档。GS Admin 曾经封装了 web 中间件只须要在配置文件配置想应得参数就能够了
rate:
limit: 15 // 每秒产生得令牌数量
burst: 2 // 令牌得大小
通过测试如果超过了限流,中间件就会触发,代码如下
func Limiter() gin.HandlerFunc {return func(c *gin.Context) {if global.Limiter.Allow() == false {global.Response{}.Failed(c, "以后申请过快,请稍后再试!")
c.Abort()
return
}
c.Next()}
}