介绍 Go 的 Rate Limiter 库
发布: (2026年1月19日 GMT+8 06:41)
2 min read
原文: Dev.to
Source: Dev.to
概览
在现代后端系统中,速率限制是必不可少的。没有速率限制,API 会面临滥用、资源耗尽以及不公平使用的风险。该库提供了一个面向生产环境、线程安全的 Go 速率限制器,基于令牌桶算法实现。
为什么选择令牌桶算法?
- 允许受控的流量突发
- 提供平滑的请求流
- 在生产系统中被广泛使用
- 简单易懂,易于推理
每个客户端都有一个随时间补充令牌的桶。请求会消耗令牌——当桶为空时,请求将被拒绝。
特性
- 面向生产环境且线程安全
- 支持突发的令牌桶算法
- 高速的内存存储
- 详细的速率限制结果(剩余令牌、
Retry-After、重置时间) - 大量单元测试和竞争条件测试
- 可选的陈旧条目清理
使用方法
import (
"fmt"
"time"
"github.com/yasserelgammal/rate-limiter/limiter"
"github.com/yasserelgammal/rate-limiter/store"
)
config := limiter.Config{
Rate: 10,
Duration: time.Second,
Burst: 20,
}
store := store.NewMemoryStore(5 * time.Minute)
rateLimiter, _ := limiter.NewTokenBucket(config, store)
if rateLimiter.Allow("user123") {
fmt.Println("Request allowed")
}
只需几行代码,即可获得一个可靠、可用于生产环境的速率限制器。
使用场景
- REST API
- Go 微服务
- 面向公众的服务
- 内部工具
- 任何需要公平且受控请求处理的场景
许可证与贡献
该项目在 MIT 许可证下开源,欢迎贡献。
如果你觉得它有用,欢迎点一个 ⭐️。这对支持开源工作非常有帮助。