☰
Hey作为Go库使用:用Work.Run()编程式构建你自己的压测工具
2026/10/3 13:01:28 网站建设 项目流程

Hey作为Go库使用:用Work.Run()编程式构建你自己的压测工具

【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey

hey 是一款用 Go 编写的轻量级 HTTP 压测工具(ApacheBenchab的现代替代者)。除了作为命令行工具,它更强大的能力在于:核心包requester完整开放了编程接口——只需构造一个Work结构体并调用Work.Run(),你就能把一整套生产级压测能力嵌入任何 Go 程序,构建属于自己的压测工具 🚀

为什么把 Hey 当库来用?

命令行压测很方便,但当你需要:

  • 在CI/CD 流水线里自动跑压测、断言性能指标时;
  • 将压测能力嵌入自研测试平台,暴露为内部 API 时;
  • 精确控制报告输出位置(写文件、写日志、写数据库)时;

把 hey 作为库引入就是最省事的选择。事实上,hey 的命令行版本本身就是用它构建的——入口文件 hey.go 做的就是"组装requester.Work→ 调用Run()"这一步。

三步完成第一次编程式压测

第 1 步:获取项目

git clone https://gitcode.com/GitHub_Trending/he/hey

模块路径为github.com/rakyll/hey(见 go.mod),核心库位于requester包。

第 2 步:构造请求与 Work 结构体

req, _ := http.NewRequest("GET", "https://example.com", nil) w := &requester.Work{ Request: req, N: 1000, // 总请求数 C: 100, // 并发数 Timeout: 20, // 单请求超时(秒) }

第 3 步:运行压测

w.Run()

Run()是阻塞调用:所有请求完成后自动打印汇总报告,包含每秒请求数(RPS)、平均/最快/最慢耗时、延迟百分位(10%~99%)、状态码分布与错误分布,报告模板见 requester/print.go。

Work 核心参数速查表

Work结构体定义在 requester/requester.go,字段含义一目了然:

参数作用
Request标准*http.Request模板,每次请求自动克隆
RequestBody请求体字节流(如 POST 表单),所有请求共享
RequestFunc自定义函数,每次请求前动态生成新请求
N要发送的总请求数
C并发 worker 数量
QPS每个 worker 的每秒限速,0表示不限速
Timeout单请求超时时间(秒)
H2是否启用 HTTP/2
Output输出格式,设为"csv"时逐条输出 CSV 指标
Writer报告输出目标,为nil时默认写到标准输出
ProxyAddrHTTP 代理地址(host:port)
DisableKeepAlives禁止 TCP 连接复用
DisableRedirects不跟随 30x 跳转
DisableCompression关闭响应压缩

进阶用法:动态请求与 CSV 报告

动态请求:给RequestFunc传入一个闭包,每次请求都能携带不同数据(如递增 ID、随机参数):

i := 0 w := &requester.Work{ RequestFunc: func() *http.Request { i++ r, _ := http.NewRequest("GET", fmt.Sprintf("https://api.example.com/items/%d", i), nil) return r }, N: 100, C: 10, } w.Run()

报告落盘 + CSV 格式:通过Writer与Output组合,把逐条指标(总耗时、DNS 耗时、连接耗时、首字节等待、状态码等 8 列)导出为 CSV,便于事后用 Excel 或分析工具处理:

f, _ := os.Create("load-test-report.csv") defer f.Close() w := &requester.Work{ Request: req, N: 500, C: 50, Output: "csv", Writer: f, } w.Run()

优雅停止与内部原理

除了Run(),Work还暴露了两个实用方法(见 requester/requester.go):

  • Init():初始化内部通道,Run()会隐式调用,通常无需手动执行;
  • Stop():向所有 worker 发送停止信号,它们完成手头请求后优雅退出——hey 命令行就是靠它实现 Ctrl+C 中断与-z 30s定时停止的。

内部实现很简洁:Run()启动C个 worker 协程共享连接池并发请求,同时一个 reporter 协程持续收集每个请求的延迟明细,结束后聚合出直方图与延迟分布(requester/report.go)。整个压测引擎只有几百行代码,易于阅读与改造 ✨

典型应用场景

  1. CI/CD 性能门禁:每次构建后自动压测,将 CSV 报告归档,RPS 或 P99 不达标即阻断发布;
  2. 测试平台压测模块:在自研平台中起一个内部服务,接收参数后构造Work运行压测并回传报告;
  3. 接口自动化回归:在 Go 测试代码中对自家接口施压,断言关键性能数据(官方单测 requester/requester_test.go 就是最佳范例)。

只需一个Work结构体加一行Run(),hey 就能让你的 Go 项目轻松拥有专业级压测工具的全部能力 🎯

【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询