介绍 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 许可证下开源,欢迎贡献。

GitHub 仓库 – rate‑limiter

如果你觉得它有用,欢迎点一个 ⭐️。这对支持开源工作非常有帮助。

Back to Blog

相关文章

阅读更多 »

Go的秘密生活:并发

将混乱的 race condition 变得有序。第15章:通过通信共享。那天星期二档案异常嘈杂。不是来自声音,而是来自 t...