重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
专注于为中小企业提供成都网站建设、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业西城免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。这篇文章主要介绍如何实现Golang限流器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
限流器是服务中非常重要的一个组件,在网关设计、微服务、以及普通的后台应用中都比较常见。它可以限制访问服务的频次和速率,防止服务过载,被刷爆。
限流器的算法比较多,常见的比如令牌桶算法、漏斗算法、信号量等。本文主要介绍基于漏斗算法的一个限流器的实现。文本也提供了其他几种开源的实现方法。
基于令牌桶的限流器实现
在golang 的官方扩展包 time 中(github/go/time),提供了一个基于令牌桶算法的限流器的实现。
原理
令牌桶限流器,有两个概念:
因此,一个令牌桶的限流器,可以限制一个时间间隔内,最多可以承载桶容量的访问频次。下面我们看看官方的实现。
实现
限流器的定义
下面是对一个限流器的定义:
type Limiter struct { limit Limit // 放入桶的频率 (Limit 为 float64类型) burst int // 桶的大小 mu sync.Mutex tokens float64 // 当前桶内剩余令牌个数 last time.Time // 最近取走token的时间 lastEvent time.Time // 最近限流事件的时间 }