Go 限流方案令牌桶 / 滑动窗口 / 自适应限流全解高并发服务必须有限流。三种常见算法对比看懂场景再选。一、令牌桶经典而稳定importgolang.org/x/time/ratelimiter:rate.NewLimiter(10,20)// 速率10/s桶容量20if!limiter.Allow(){returnerrors.New(429 too many requests)}原理每秒发 10 个令牌到桶中桶满 20请求要拿令牌。适合突发流量可以容忍的场景例如网关 QPS 控制。二、滑动窗口精确但消耗内存typeSlidingWindowstruct{mu sync.Mutex limitintwindow time.Duration requests[]time.Time}func(s*SlidingWindow)Allow()bool{s.mu.Lock()defers.mu.Unlock()now:time.Now()cutoff:now.Add(-s.window)i:0forilen(s.requests)s.requests[i].Before(cutoff){i}s.requestss.requests[i:]iflen(s.requests)s.limit{returnfalse}s.requestsappend(s.requests,now)returntrue}适合风控、秒杀场景需要 60 秒内不超过 1000 次的精确约束。三、计数器实现简单但窗口边界突兀typeFixedWindowstruct{mu sync.Mutex cntinttsint64limitint}func(s*FixedWindow)Allow()bool{s.mu.Lock()defers.mu.Unlock()now:time.Now().Unix()ifnow!s.ts{s.cnt0s.tsnow}ifs.cnts.limit{returnfalse}s.cntreturntrue}缺点每分钟切点可能突发 2 倍请求如11:59:59、12:00:01。四、漏桶平滑限流适合QQ 长连接强制输出速率。importgithub.com/juju/ratelimitb:ratelimit.NewBucket(1*time.Second,100)// 1 秒填一次一次填 100 个五、Adaptive 自适应限流// 监控延迟、CPU、错误率ifcpuUsage90%{limiter.SetLimit(limiter.Limit()*0.8)}自适应按当前指标动态调整避免挂掉-限流-恢复-再限流的震荡。六、实战HTTP 限流中间件importgolang.org/x/time/ratefuncRateLimitMiddleware(limiter*rate.Limiter)gin.HandlerFunc{returnfunc(c*gin.Context){if!limiter.Allow(){c.JSON(429,gin.H{code:RATE_LIMIT})c.Abort()return}c.Next()}}按 IP 分桶limiters:sync.Map{}varraterate.Limit(1)funclimiterForIP(ipstring)*rate.Limiter{l,ok:limiters.Load(ip)ifok{returnl.(*rate.Limiter)}n:rate.NewLimiter(rate,5)limiters.Store(ip,n)returnn}七、限流 熔断 降级服务级别限流在前、熔断在后、降级在最末。工具功能golang.org/x/time/rate限流sony/gobreaker熔断ioa/kratos/middleware三合一八、踩坑清单跨实例限流进程内 token bucket 不是集群限流需 Redis Lua令牌突增突发量大时建议加上 Cost按请求消耗Allow() 不能 sleep 阻塞需要的话用 Wait / Reserve九、集群限流Redis LualocalkeyKEYS[1]locallimittonumber(ARGV[1])localcurrenttonumber(redis.call(incr,key))ifcurrent1thenredis.call(expire,key,ARGV[2])endifcurrentlimitthenreturn0endreturn1Go 端调用 Lua, atomic。十、总结与展望本地限流用rate.Limiter精确控制用滑动窗口集群层用 Redis Lua 或 Sentinel自适用调优是高级用。未来AIOP 平台将限流纳入 telemetry自动调优窗口与阈值。十一、参考文献rate 包文档阿里 SentinelCloudflare 限流博客