Hey HTTP压测工具命令行解析深度剖析:20个flag与headerSlice可重复-H参数设计指南

发布时间:2026/10/4 18:03:46
Hey HTTP压测工具命令行解析深度剖析:20个flag与headerSlice可重复-H参数设计指南 Hey HTTP压测工具命令行解析深度剖析20个flag与headerSlice可重复-H参数设计指南【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/heyhey是一个轻量级的HTTP 压测工具ApacheBench 的现代替代品单文件即可完成数千并发请求。本文带你深度剖析 hey 的命令行参数解析设计20 个 flag 如何定义、headerSlice自定义类型如何让-H参数支持可重复传入以及正则表达式在其中扮演的角色。hey 是什么一个极简 HTTP 负载生成器hey 的核心职责只有一个向 Web 应用发送指定数量的请求并输出响应时间的统计报告。相比ab它基于Go 语言编写天然高并发单二进制无依赖支持HTTP/2-h2参数一键开启输出更友好支持 CSV 格式导出-o csv想从源码开始体验克隆仓库即可构建git clone https://gitcode.com/GitHub_Trending/he/hey整个命令行层的核心代码集中在 hey.go 一个文件中不到 300 行是学习 CLI 参数设计的绝佳样本。20个flag参数速查表hey 压测参数一览所有 flag 在 hey.go 的var块中集中声明配合flag.String、flag.Int、flag.Duration等标准库函数注册。按功能可分为五组1️⃣ 请求量与控制类参数类型默认值说明-nint200总请求数-cint50并发 worker 数-qfloat640每个 worker 的 QPS 限流-zduration0压测时长如10s、3m指定后忽略-n-tint20单请求超时秒0表示不限2️⃣ 请求内容与方法类参数说明-mHTTP 方法GET / POST / PUT / DELETE / HEAD / OPTIONS-d请求体内容-D从文件读取请求体-TContent-Type默认text/html-AAccept 头-U自定义 User-Agent-aBasic 认证格式用户名:密码3️⃣ 头信息类-H自定义 HTTP 头可重复指定本文重点见下文-host覆盖 HTTP Host 头虚拟主机场景必备4️⃣ 网络行为类-xHTTP 代理地址host:port-h2启用 HTTP/2-disable-compression/-disable-keepalive/-disable-redirects三个布尔开关分别关闭压缩、连接复用与自动跟随重定向——压测时常用它们隔离变量得到纯净的网络数据5️⃣ 运行环境类-o输出类型目前支持csv-cpus限制 CPU 核心数默认取当前机器核数hey.go 中通过runtime.GOMAXPROCS(-1)获取完整的参数说明文案定义在 hey.go 的usage常量里hey -h时打印到标准错误流。核心设计可重复的 -H 参数与 headerSlice很多工具的自定义头只能用逗号或分号拼接成一个字符串用户还得自己写分割逻辑。hey 的做法更优雅注册一个可重复的 flag。var hs headerSlice flag.Var(hs, H, )就这两行hey.go。关键在于flag.Var它接受任何实现了flag.Value接口的类型之后每出现一次-H就会调用一次Set方法。headerSlice仅 10 行的接口实现headerSlice的定义在 hey.gotype headerSlice []string func (h *headerSlice) String() string { return fmt.Sprintf(%s, *h) } func (h *headerSlice) Set(value string) error { *h append(*h, value) return nil }String()打印 flag 默认值时调用返回当前切片内容Set(value)每传入一个-H就append一次——这就是可重复参数的本质接口 累积切片于是用户可以自然地写成hey -H Accept: application/json \ -H Authorization: Bearer token \ https://example.com正则校验防御性解析收集到原始字符串后hey 在 hey.go 逐个用正则校验格式headerRegexp ^([\w-]):\s*(.)这个正则要求必须是合法的名字: 值形式解析失败就打印用法并退出usageAndExit。配套还有 Basic 认证的正则^(.):([^\s].)hey.go。 值得注意小写的-h曾是旧版自定义头参数现在已被废弃。如果你还在用-h程序会直接提示Flag -h is deprecated, please use -H insteadhey.go。小写单字母让位给标准的帮助参数大写-H承担业务功能——这是参数命名演进的经典案例。参数校验与执行流程从 flag 到 Work 结构体参数注册之后main()的执行流程hey.go可以概括为四步1. 互斥校验-z指定时长后请求数直接设为math.MaxInt32无限否则校验-n -c 0不满足立即退出。这种参数间约束前置校验避免了跑到一半才报错。2. 组装请求头先Content-Type再叠加所有-H然后Accept、Basic AuthUser-Agent 最后统一追加hey/0.0.1后缀保证来源可追踪hey.go。3. 构建请求http.NewRequest创建请求读取-D文件体设置ContentLength与req.Host。4. 交给 requester 包所有 flag 最终映射进 requester.Work 结构体的字段——N、C、QPS、Timeout、H2、ProxyAddr等一一对应再调用w.Run()启动 worker 池。QPS 限流则由time.Ticker精确按1e6/QPS微秒间隔放行requester/requester.go。整个设计呈现出清晰的单向数据流命令行字符串 → 校验 → 结构化配置 → 执行引擎flag 包本身零业务逻辑。典型压测命令示例结合上面的参数几组高频用法# 1000 请求、100 并发 hey -n 1000 -c 100 https://example.com # 持续压测 30 秒-z 优先于 -n hey -z 30s https://example.com # 每 worker 限流 10 QPS hey -q 10 -c 5 -z 30s https://example.com # POST 请求 自定义头 HTTP/2 hey -m POST -d a1b2 \ -H Content-Type: application/json \ -h2 https://example.com完整示例参考 README.md。总结hey 的命令行设计浓缩了三个可复用的模式集中声明所有 flag 在一个var块配合集中式usage文案可读性极佳可重复参数flag.Var 自定义flag.Value类型headerSlice10 行代码实现优雅的多值采集前置校验参数间约束-nvs-c、-z覆盖-n在启动前一次性检查完毕这套字符串 → 结构化配置 → 执行的单向数据流几乎可以原样套用到你正在写的任何 Go CLI 工具中。【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考