对于用户访问频率控制,比如每分钟,只允许访问多少次,方法很多。较为精准的就有比如“利用Redis实现访问控制频率”,还有就是RateLimiter(令牌桶算法)等。
visitercontrol 介绍:
https://github.com/yudeguang/visitercontrol ,可实现单位时间内,最多允许多少用户访问,可以以IP或者用户名等作为区分用户。与RateLimiter不同,visitercontrol可以实现较为精确的流量限制。与Redis相比,其效率远远高于Redis,Redis每秒大致只能实现十万级别的读写。
对于访问控制,分为两种,一种是简单规则,一种是复杂规则,复杂规则其实就是多个简单规则的叠加,并同时作用在同一用户身上。
主要核心函数如下:
package visitercontrol
import "github.com/yudeguang/visitercontrol"
Index
type MultipleVisitercontrol
type MultipleVisitercontrol struct { // contains filtered or unexported fields }
func NewMultipleVisitercontrol
func NewMultipleVisitercontrol(multipleRule ...Rule) *MultipleVisitercontrol
初始化一个多重规则的频率控制策略 例: multipleVc := NewMultipleVisitercontrol(Rule{time.Minute * 5, 20, 100}, Rule{time.Minute * 30, 50, 1000}, Rule{time.Hour * 24, 200, 10000}) 它表示: 在5分钟内每个用户最多允许访问20次,并且我们预计在这5分钟内大致有100个用户会访问我们的网站 在30分钟内每个用户最多允许访问50次,并且我们预计在这30分钟内大致有1000个用户会访问我们的网站 在24小时内每个用户最多允许访问200次,并且我们预计在这24小时内大致有10000个用户会访问我们的网站 以上任何一条规则的访问次数超出,都不允许访问,并且我们在匹配规则时,是按时间段从小到大匹配
func (*MultipleVisitercontrol) AllowVisit
func (this *MultipleVisitercontrol) AllowVisit(key interface{}) bool
是否允许访问,允许访问则往访问记录中加入一条访问记录 例: AllowVisit("usernameexample")
func (*MultipleVisitercontrol) AllowVisitIP
func (this *MultipleVisitercontrol) AllowVisitIP(ip string) bool
是否允许某IP的用户访问 例: AllowVisitIP("127.0.0.1")
用于NewMultipleVisitercontrol函数的初始化
type SingleVisitercontrol
type SingleVisitercontrol struct { // contains filtered or unexported fields }
某单位时间内允许多少次访问
func NewSingleVisitercontrol
func NewSingleVisitercontrol(defaultExpiration time.Duration, numberOfAllowedAccesses, estimatedNumberOfOnlineUsers int) *SingleVisitercontrol
初始化一个单规则频率控制策略 例: vc := NewSingleVisitercontrol(time.Minute*30, 50, 1000) 它表示: 在30分钟内每个用户最多允许访问50次,并且我们预计在这30分钟内大致有1000个用户会访问我们的网站
func (*SingleVisitercontrol) AllowVisit
func (this *SingleVisitercontrol) AllowVisit(key interface{}) bool
是否允许访问,允许访问则往访问记录中加入一条访问记录 例: AllowVisit("usernameexample")
func (*SingleVisitercontrol) AllowVisitIP
func (this *SingleVisitercontrol) AllowVisitIP(ip string) bool
是否允许某IP的用户访问 例: AllowVisitIP("127.0.0.1")
有疑问加站长微信联系(非本文作者)