在微服务里面的业务场景里面,部分业务会涉及到限流,以便把更多的资源倾斜到更重要的地方。限流里面我们最常用的主要也是;令牌桶算法,即:
每分钟固定产生N个令牌,抢到令牌就可以执行,抢不到则执行不了。
在go语言中,我们可以使用 golang.org/x/time/rate 框架来完成限流的措施。下面来演示一下:
一、安装依赖
这里主要安装rate依赖,执行命令如下:
go get -u golang.org/x/time/rate
二、编写限流初始化
在go语言里面,我们已经很熟悉了,需要使用任何其他信息的话,几乎都需要在main方法执行的时候完成初始化,所以这里在config.go文件中编写初始化方法:
var limit *rate.Limiter func InitRate() { // 这里代表产生令牌的速率,设置time.Second / 10代表的是每1/10秒产生一个令牌,也就是1秒钟产生10个令牌 r := rate.Every(time.Second / 10) // 第一个参数代表速率: // 第二个参数代表桶的大小:即,如果没有人来消费,那么桶里最多存着10个令牌, limit = rate.NewLimiter(r, 10) }
然后在main方法里面执行这里的初始化即可,如下图:
三、使用限流器
gin框架中使用限流器还是以中间件的方式来使用,这里我们编写限流处理方法,示例代码如下:
func Rate() gin.HandlerFunc { return func(c *gin.Context) { //一次消费1个令牌,如果桶里面能取出令牌,则返回true,如果桶里面不能取出令牌,则返回false if limit.AllowN(time.Now(), 1) { //正常请求,直接放过 c.Next() } else { //进入限流了,返回错误信息 c.JSON(http.StatusOK, gin.H{"code": http.StatusBadRequest, "message": "请求太频繁", "data": nil}) c.Abort() return } } }
然后把这个方法注册到gin的中间件即可,示例如下:
四、测试
这里我们编写的限流器是每1/10秒产生一个令牌,可以把这块设置得大一点,比如2分组产生一个令牌,请求接口测试如下:
以上就是go web开发中如何使用限流的教程。最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...