Hey 压测工具 API 完整指南:requester.Work 结构体逐字段说明与调用示例
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
hey是一款用 Go 编写的轻量级HTTP 压测工具,常被视为 ApacheBench(ab)的现代化替代品,支持高并发请求、QPS 限速、HTTP/2 与 CSV 输出。它的核心 API 全部收敛在 requester/requester.go 中的一个结构体:requester.Work。搞懂这个结构体的每个字段,你就掌握了用 Go 代码驱动 hey 做负载测试的全部能力 🚀。
hey 压测核心:Work 结构体是什么?
Work是一次压测任务的"总描述":要发什么请求、发多少、并发多少、限速多少、结果输出到哪里。命令行版本hey的工作流程非常简单——把-n、-c、-q等命令行参数一一翻译成Work字段,然后调用Run()执行(见 hey.go):
w := &requester.Work{ Request: req, // 请求模板 N: num, // 总请求数 C: conc, // 并发数 QPS: q, // 限速 Timeout: t, // 超时(秒) } w.Init() w.Run()换句话说,命令行 hey 只是 Work 的一层壳。把它当作 Go 库引入自己的项目,就能做自定义的动态请求、嵌入式压测、自动化性能巡检。
requester.Work 字段逐字段说明 📊
| 字段 | 类型 | 含义 | 对应 CLI 参数 |
|---|---|---|---|
Request | *http.Request | 请求模板,每次压测克隆此请求发送 | URL、-m、-H等 |
RequestBody | []byte | 请求体字节,克隆请求时重新填充 Body | -d/-D |
RequestFunc | func() *http.Request | 动态请求生成函数;非 nil 时优先于Request生效 | 无(纯 API 能力) |
N | int | 要发送的总请求数 | -n(默认 200) |
C | int | 并发数(worker 数),每个 worker 负责N/C个请求 | -c(默认 50) |
H2 | bool | 启用HTTP/2(自动调用http2.ConfigureTransport) | -h2 |
Timeout | int | 单请求超时(秒),0 表示不限时 | -t(默认 20) |
QPS | float64 | 限速:每个 worker每秒的请求数,0 为不限速 | -q |
DisableCompression | bool | 关闭响应压缩 | --disable-compression |
DisableKeepAlives | bool | 禁止复用 TCP 连接 | --disable-keepalive |
DisableRedirects | bool | 不跟随 3xx 跳转 | --disable-redirects |
Output | string | 输出格式,填"csv"输出逐条指标流 | -o csv |
ProxyAddr | *url.URL | HTTP 代理地址(host:port) | -x |
Writer | io.Writer | 结果输出目标,nil 时写到 stdout | — |
⚠️ 注意:
N与C有约束——N不能小于C(否则N/C整除后 worker 无事可做);而Timeout单位是秒而不是纳秒,和 Go 常规的time.Duration不一样,这是新手最容易踩的坑。
Work 的调用方式:三步跑起压测
第 1 步:Init() 初始化内部通道
requester.go 中的Init()会创建结果通道results(容量为min(C*1000, 1000000))和停止信号通道stopCh,内部用sync.Once保证只初始化一次,可放心重复调用。
第 2 步:Run() 阻塞执行
Run()的完整流程是:
- 先启动reporter协程,轮询结果通道、计算延迟分布与状态码统计(统计逻辑见 requester/report.go);
- 再启动
C个 worker 协程并发发请求,每个请求用httptrace记录DNS 解析、建连、写请求、首字节响应各阶段耗时(requester.go); - 全部完成后
Finish()汇总并打印 summary。
第 3 步:Stop() 优雅停止
向stopCh发送C个停止信号,worker 会在当前请求结束后退出。CLI 版本用它实现了Ctrl+C 停止和-z 30s定时停止两个特性(hey.go),你也可以在自己的程序里同样用法。
进阶:用 RequestFunc 发动态请求 🎯
固定Request模板适合常规压测;如果你的接口需要每次请求变化参数(比如不同的用户 ID、令牌),就设置RequestFunc:
w := &requester.Work{ RequestFunc: func() *http.Request { req, _ := http.NewRequest("GET", "https://api.example.com/user/"+randID(), nil) return req }, N: 1000, C: 50, } w.Run()执行时会走 makeRequest 的RequestFunc != nil分支,逐次调用生成函数,而不做请求克隆。
获取源码并验证
git clone https://gitcode.com/GitHub_Trending/he/hey cd hey go test ./requester/官方自带了覆盖请求计数、QPS 限速、Header 透传、请求体等场景的测试用例,非常适合当作 API 用法示例来读,推荐从 requester/requester_test.go 开始。
相关文件速查
| 文件 | 说明 |
|---|---|
| requester/requester.go | Work结构体定义与执行逻辑 |
| requester/report.go | 延迟统计与结果报表 |
| requester/print.go | 输出格式(summary / csv) |
| hey.go | 命令行入口,Work 的组装范例 |
| requester/requester_test.go | API 用法与行为验证用例 |
一句话总结:requester.Work= 请求模板(Request/RequestFunc)+ 规模(N、C)+ 限制(QPS、Timeout)+ 输出(Output、Writer)。字段全部赋值完毕后,Init()→Run()即可,需要提前终止再调Stop()。这就是 hey 压测库 API 的全部精髓 ✅
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考