Golang微服务限速核心用rate.Limiter实现令牌桶算法,需为各下游服务/租户独立实例化、动态配置、集成至HTTP客户端中间件,并配套监控告警与熔断降级。
在微服务架构中,服务间调用的流量控制至关重要。Golang 实现限速(Rate Limiting)的核心思路是:在调用下游服务前,对当前请求进行速率判断,超限则快速失败或排队,避免压垮下游。常用且轻量的方式是使用令牌桶(Token Bucket)算法,兼顾突发流量容忍与长期平均限速。
Go 官方扩展库 rate.Limiter 封装了令牌桶逻辑,简单可靠,适合大多数服务间限速场景。
rate.NewLimiter(10, 5) 表示平均 10 QPS、最多允许 5 次瞬时并发limiter.Wait(ctx) —— 它会阻塞直到拿到令牌,或返回超时错误;若需非阻塞,可用 limiter.Allow() 或
Reserve() 判断后自行处理当多个上游服务或不同租户共用同一客户端调用下游时,需支持多维度限速策略。
map[string]*rate.Limiter 或 sync.Map 缓存各租户/服务名对应的 Limiter,key 可以是 tenantID 或 upstreamServiceName
将限速逻辑下沉到统一的 HTTP client 封装层,比在每个业务方法里手动调用更安全、易维护。
http.RoundTripper,在 RoundTrip 方法开头执行限速检查,再调用真实 TransportClient.DoWithRate(ctx, req) 方法,在内部完成等待 + 请求发送 + 错误映射限速不是万能的,需配套机制保障稳定性与可排查性。
rate_limit_requests_total{service="xxx", allowed="true/false"} 和 rate_limit_wait_seconds_bucket