不管是在单体服务中还是在微服务中,开发者为前端提供的 API 接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性。即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪。
go-zero
集成了开箱即用的 限流器 。其中内置了两种限流器,也对应两类使用场景:
种类 | 原理 | 场景 |
---|---|---|
periodlimit |
单位时间限制访问次数 | 需要强行限制数据的传输速率 |
tokenlimit |
令牌桶限流 | 限制数据的平均传输速率,同时允许某种程度的突发传输 |
本文就来介绍一下 periodlimit
。
使用
const (
seconds = 1
total = 100
quota = 5
)
// New limiter
l := NewPeriodLimit(seconds, quota, redis.NewRedis(s.Addr(), redis.NodeType), "periodlimit")
// take source
code, err := l.Take("first")
if err != nil {
logx.Error(err)