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时默认写到标准输出 |
ProxyAddr | HTTP 代理地址(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)。整个压测引擎只有几百行代码,易于阅读与改造 ✨
典型应用场景
- CI/CD 性能门禁:每次构建后自动压测,将 CSV 报告归档,RPS 或 P99 不达标即阻断发布;
- 测试平台压测模块:在自研平台中起一个内部服务,接收参数后构造
Work运行压测并回传报告; - 接口自动化回归:在 Go 测试代码中对自家接口施压,断言关键性能数据(官方单测 requester/requester_test.go 就是最佳范例)。
只需一个Work结构体加一行Run(),hey 就能让你的 Go 项目轻松拥有专业级压测工具的全部能力 🎯
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考