固定窗口计数限流存在临界突刺问题,适合低精度场景;令牌桶算法通过golang.org/x/time/rate实现平滑限流,支持突发流量;分布式环境下需结合Redis的INCR与EXPIRE命令或Lua脚本实现全局限流,确保多实例间请求控制一致。

在高并发场景下,控制请求频率是保护后端服务稳定的重要手段。Golang 因其高效的并发模型,非常适合实现请求限流。常见的限流策略有固定窗口、滑动窗口、漏桶和令牌桶算法。下面介绍几种实用的 Golang 请求限流技巧,帮助你在 Web 服务中有效控制流量。
最基础的限流方式是固定时间窗口计数。比如限制每秒最多 100 个请求,可以维护一个每秒重置的计数器。
虽然简单,但存在“临界突刺”问题——大量请求可能集中在窗口切换时通过。适合对精度要求不高的场景。
示例代码:
var (
requestCount int
lastReset = time.Now()
mu sync.Mutex
)
func rateLimitMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
mu.Lock()
now := time.Now()
if now.Sub(lastReset) > time.Second {
requestCount = 0
lastReset = now
}
if requestCount >= 100 {
http.StatusTooManyRequests, nil)
return
}
requestCount++
mu.Unlock()
next(w, r)
}
}
令牌桶算法允许突发流量,同时控制平均速率,是更灵活的选择。Golang 标准库 golang.org/x/time/rate 提供了开箱即用的实现。
你可以为每个客户端或全局创建一个限流器,控制每秒生成的令牌数和最大突发量。
常见用法:
import "golang.org/x/time/rate"
var limiter = rate.NewLimiter(10, 50) // 10rps, burst=50
func limitHandler(w http.ResponseWriter, r *http.Request) {
if !limiter.Allow() {
http.StatusTooManyRequests, nil)
return
}
// 处理业务逻辑
}
单机限流无法应对多实例部署。要实现全局限流,需依赖共享存储如 Redis。
利用 Redis 的 INCR 和 EXPIRE 命令,可实现分布式固定窗口限流。Lua 脚本能保证原子性操作。
Primeshot
专业级AI人像摄影工作室
36
查看详情
推荐使用 RediSearch 或直接调用 Lua 脚本实现滑动窗口算法,避免多个命令间的竞争问题。
例如:统计最近一分钟的请求数,超过阈值则拒绝。
// Lua script example for sliding window
local count = redis.call("INCR", KEYS[1])
if count == 1 then
redis.call("EXPIRE", KEYS[1], 60)
end
return count <= tonumber(ARGV[1]) and 1 or 0
在 Go 中使用 go-redis 驱动执行该脚本,实现跨节点一致的限流控制。
将限流封装成 HTTP 中间件,便于复用和组合。可以根据路径、IP、用户 ID 等维度设置不同规则。
建议结构:
这样既能支持个性化限流,又能保持性能开销可控。
基本上就这些。选择合适的算法取决于你的业务需求:追求简单可用选 token bucket,需要精确控制用滑动窗口,分布式系统别忘了引入 Redis。合理限流,既能防刷又能保障核心服务稳定。
以上就是如何用Golang实现请求限流_Golang Web请求限流技巧的详细内容,更多请关注其它相关文章!
# go
# redis
# 如何用
# 令牌
# red
# 标准库
# win
# ai
# 后端
# golang
# 石家庄安全网站建设
# seo优化难点
# 美甲易烊千玺网站推广
# 广东营销推广咨询服务
# 泗水品牌营销推广
# 全力做好营销推广工作的通知
# 关岭问答营销推广
# 网站优化的方案怎么写的
# 西塘营销推广方案怎么写
# 义乌网站建设课程评价
# 推荐使用
# 你在
# 多个
# 客户端
# 既能
# 又能
# 最多
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
传统曲艺莲花落的表演形式是
天堂漫画网页版在线阅读 天堂漫画手机版入口
深入理解J*aScript异步操作:setTimeout与调用栈的真相
深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析
怎样让Windows 11的开始菜单恢复经典样式_Open-Shell工具使用指南【怀旧】
Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案
顺丰快递怎么查物流_顺丰快递物流信息实时查询操作指南
《图怪兽》退出登录方法
c++如何使用std::thread::join和detach_c++线程生命周期管理
如何在Podman容器中运行Composer_Docker替代品Podman的PHP与Composer容器化实践
Python对象引用与属性赋值:理解链表中的行为
Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】
mysql如何管理数据库账户_mysql数据库账户管理技巧
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐
《鹿路通》退余额方法
铁路12306官网入口 铁路12306中国铁路官网登录首页
三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧
小红书网页版怎么进 小红书网页版通用入口
《淘宝联盟》推广自己的店铺方法
苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤
《下一站江湖2》心法融合技巧
2025考研成绩查询时间入口分享
《植物大战僵尸3》火龙草作用介绍
顺丰快递在线查询系统 顺丰快递官方查单入口
漫蛙漫画直连入口 _ manwa官方备用入口实时检测
抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?
虫虫助手如何更新游戏
Win10输入法不见了怎么办 Win10找回语言栏图标教程
性能与资源监视器快捷打开
菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤
抖音火山版如何进行提现
利用Flexbox实现图片元素的二维布局:2x2网格排列指南
C++ bind函数使用教程_C++参数绑定与函数适配器的应用
冬季去哪个城市旅游更有可能观测到极光
Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型
手机远程连接电脑方法
《浙里办》电子发票开具方法
mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法
PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略
行者app怎样导出日志
《异星探险家》古怪的物品作用介绍
高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法
路由器DNS怎么设置最快 优化DNS提升上网速度教程
Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】
如何自定义苹果手机铃声
荣耀 Magic10 Pro 系统更新提示失败_荣耀 Magic10 Pro 升级修复
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
2025SNH48年度青春盛典门票价格及购买方式
sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码
2025-11-19
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。