在 Web 应用开发、接口调试与性能优化过程中,负载测试是不可或缺的环节------它能帮助我们模拟高并发场景,检测接口的响应速度、吞吐量、稳定性,提前发现系统在高负载下的瓶颈(如超时、崩溃、响应延迟飙升等问题)。今天,我们重点介绍一款轻量、高效、易用的开源 HTTP 负载测试工具------hey,它基于 Go 语言开发,凭借 Go 语言的并发优势,能快速模拟大量并发请求,且配置灵活、输出直观,是开发者和测试工程师的得力助手。
本文将从工具核心特性、环境安装、基础用法、高级用法、实战示例到拓展知识,全方位讲解 hey 的使用方法,全程搭配可直接复制运行的示例代码,兼顾新手入门与进阶需求,让你快速掌握这款工具的核心能力。
一、hey 工具核心介绍
hey 是由 Jaana Dogan 使用 Go 语言开发的开源 HTTP 负载测试工具,最初名为 boom,后为避免命名冲突更名为 hey,目前托管在 GitHub(仓库地址:https://github.com/rakyll/hey),遵循 MIT 开源协议,支持全平台运行。
作为一款轻量级压测工具,hey 摒弃了复杂的图形界面,完全基于命令行操作,核心优势源于 Go 语言的 goroutine 并发模型------无需复杂配置,就能轻松模拟上百、上千甚至上万的并发请求,且资源占用远低于传统压测工具(如 JMeter),尤其适合快速验证接口性能、临时压测场景,也可集成到 CI/CD 流程中实现自动化压测。
1.1 核心特性
-
多协议支持:兼容 HTTP、HTTPS 以及 WebSocket 协议,同时支持 HTTP/2 站点,可满足不同类型 Web 服务的压测需求;
-
高并发能力:依托 Go 语言 goroutine 机制,模拟大量并发连接,无需担心线程切换开销,能充分利用 CPU 资源;
-
高度可定制:支持自定义请求方法(GET、POST、PUT 等)、请求头、请求体、超时时间、并发数、请求总数等参数,适配复杂测试场景;
-
丰富统计输出:压测结束后,自动生成详细的统计报告,包括请求总耗时、QPS(每秒请求数)、响应时间分布、状态码分布、DNS 解析耗时等关键指标;
-
易用性强:命令行参数简洁易懂,无需编写复杂脚本,新手可快速上手,同时支持输出 CSV 格式报表,便于后续数据分析;
-
跨平台支持:可运行在 Linux、MacOS、Windows 等主流操作系统,安装部署简单便捷。
1.2 适用场景
-
接口开发调试:验证接口在高并发下的响应稳定性,排查接口超时、报错等问题;
-
性能瓶颈定位:模拟真实用户访问场景,检测系统在高负载下的吞吐量、响应延迟,定位 CPU、内存、网络等瓶颈;
-
自动化压测:集成到 CI/CD 流程,在代码部署前自动执行压测,确保新版本接口性能达标;
-
临时快速压测:无需搭建复杂环境,通过简单命令快速验证某个接口或页面的承载能力。
二、hey 环境安装(全平台,极简版)
hey 安装无需复杂操作,最便捷的方式是使用 go install 一键安装,适用于所有已配置 Go 环境的用户;未配置 Go 环境的用户,补充简单的 Go 环境配置和备选安装方式,高效完成部署。
2.1 前提条件(仅针对 go install 方式)
需提前安装 Go 语言环境(版本 ≥ 1.16),Go 语言安装可参考官方文档:https://golang.org/doc/install,安装完成后执行 go version 验证是否成功(输出版本信息即达标)。
2.2 核心安装方法(go install 一键安装,全平台通用)
无论 Linux、MacOS 还是 Windows 系统,只要已配置 Go 环境,执行以下单条命令即可完成 hey 安装,无需额外配置:
bash
# 一键安装 hey(自动下载源码、编译并安装到 Go 的 bin 目录,可直接全局调用)
go install github.com/rakyll/hey@latest
# 验证安装是否成功(查看版本)
hey -v
安装成功后,终端会输出 hey 的版本信息(如 hey version 0.1.5,当前最新版本),说明安装完成,可直接在命令行使用 hey 命令。
2.3 备选安装方式(适用于未配置 Go 环境的场景)
若未安装 Go 环境,且不想额外配置,可直接下载对应系统的二进制文件,步骤极简:
-
访问 hey 官方 GitHub Releases 页面:https://github.com/rakyll/hey/releases;
-
下载对应系统架构的二进制文件(Linux 选 hey_linux_amd64、MacOS 选 hey_darwin_amd64、Windows 选 hey_windows_amd64.exe);
-
将下载的文件放到系统可执行目录(Linux/MacOS 放 /usr/local/bin,Windows 放 Program Files 并添加到 PATH 环境变量);
-
打开终端/CMD,输入
hey \-v,输出版本信息即安装成功。
说明:go install 是最推荐的方式,无需手动处理编译、环境变量配置,Go 会自动完成所有操作,适合绝大多数开发者;备选方式仅作为补充,适合未使用 Go 语言的测试人员。
三、hey 基础用法(必学)
hey 的核心用法是通过命令行参数指定压测配置,基本语法格式如下:
bash
hey [选项参数] <目标URL>
其中,\<目标URL\> 是必填项(如 http://localhost:8080/api/test),选项参数是可选项,用于配置并发数、请求总数、请求方法等,下面先介绍最常用的基础参数和示例,帮你快速上手。
3.1 核心基础参数(必记)
hey 的参数简洁明了,以下是日常压测中最常用的 5 个基础参数,覆盖 80% 的基础压测场景:
| 参数 | 说明 | 默认值 |
|---|---|---|
| -n | 指定压测的总请求数(若指定 -z 参数,该参数会被忽略) | 200 |
| -c | 指定并发请求数(即同时发起的请求数量,建议根据服务器配置调整) | 50 |
| -z | 指定压测持续时间(格式:10s 表示 10 秒,3m 表示 3 分钟,忽略 -n 参数) | 无(默认按 -n 参数执行) |
| -m | 指定 HTTP 请求方法(GET、POST、PUT、DELETE、HEAD、OPTIONS 等) | GET |
| -t | 指定每个请求的超时时间(单位:秒,0 表示无超时限制) | 20 |
3.2 基础用法示例(可直接复制运行)
以下示例均以 http://localhost:8080/api/hello 为目标接口(可替换为自己的接口地址),覆盖最常见的基础压测场景,新手可逐一尝试,熟悉参数用法。
示例 1:默认配置压测(最简洁)
不指定任何可选参数,使用默认配置(总请求数 200、并发数 50、GET 方法、超时 20 秒)进行压测:
bash
hey http://localhost:8080/api/hello
压测结束后,会输出详细的统计报告,后续会专门讲解报告解读方法。
示例 2:指定总请求数和并发数
模拟 1000 个总请求,同时发起 100 个并发请求,压测 GET 接口:
bash
hey -n 1000 -c 100 http://localhost:8080/api/hello
适用场景:验证接口在固定请求量、固定并发下的性能(如模拟 100 个用户同时访问接口,共访问 1000 次)。
示例 3:指定压测持续时间
模拟并发数 50,持续压测 30 秒(忽略总请求数,按时间结束):
bash
hey -c 50 -z 30s http://localhost:8080/api/hello
适用场景:模拟长时间高并发场景(如高峰期持续 30 秒的用户访问),检测接口的稳定性。
示例 4:指定请求方法和超时时间
模拟 500 个总请求、30 个并发,使用 POST 方法,超时时间设置为 10 秒:
bash
hey -n 500 -c 30 -m POST -t 10 http://localhost:8080/api/submit
适用场景:压测非 GET 方法的接口(如提交表单、提交数据的 POST 接口),同时限制请求超时时间,避免请求长时间阻塞。
3.3 压测报告解读(关键)
无论使用哪种基础用法,压测结束后 hey 都会输出一份详细的统计报告,以下是一份典型报告的解读(结合示例 2 的输出),帮你快速提取关键信息:
bash
Summary:
Total: 0.8334 secs
Slowest: 0.3334 secs
Fastest: 0.0463 secs
Average: 0.0726 secs
Requests/sec: 27.4439 # QPS(每秒请求数,核心指标)
Total data: 2000 bytes
Size/request: 200 bytes
Response time histogram: # 响应时间分布(关键,看延迟集中范围)
0.046 [1] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.075 [8] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.104 [1] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Latency distribution: # 延迟分位数(核心指标,看不同分位的延迟)
10% in 0.0500 secs
25% in 0.0550 secs
50% in 0.0680 secs # 中位数延迟(一半请求的延迟≤该值)
75% in 0.0820 secs
90% in 0.0950 secs # 90%请求的延迟≤该值(关键,评估大部分用户体验)
95% in 0.1020 secs
99% in 0.3334 secs
Status code distribution: # 状态码分布(看接口成功率)
[200] 10 responses # 200 表示成功,若有 4xx、5xx 说明接口有异常
核心关注 3 个指标:
-
QPS(Requests/sec):每秒能处理的请求数,数值越高,接口吞吐量越好;
-
延迟分位数(尤其是 90%、95%、99%):90% 的请求延迟≤某个值,说明大部分用户的访问体验,若该值过高,说明接口延迟严重;
-
状态码分布:若存在 4xx(客户端错误)、5xx(服务端错误),需排查接口是否存在异常,成功率 = 成功状态码(如 200)请求数 / 总请求数。
四、hey 高级用法(进阶必备)
基础用法适用于简单压测场景,而实际开发中,我们常需要模拟更复杂的请求(如带请求头、请求体、身份认证、代理等),下面介绍 hey 的高级参数和对应的实战示例,覆盖复杂压测场景。
4.1 高级核心参数
| 参数 | 说明 | 示例 |
|---|---|---|
| -H | 自定义 HTTP 请求头(可重复使用,添加多个请求头) | -H "Content-Type: application/json" -H "Token: abc123" |
| -d | 指定 HTTP 请求体(适用于 POST、PUT 等方法) | -d '{"name":"test","age":20}' |
| -D | 从文件中读取请求体(适用于请求体较大的场景) | -D ./request.json |
| -a | 基本身份认证(用户名:密码) | -a "admin:123456" |
| -x | 指定 HTTP 代理(格式:host:port) | -x "127.0.0.1:8080" |
| -o | 指定输出格式(默认输出摘要,支持 csv 格式) | -o result.csv(将报告保存到文件) |
| -q | 限制每个并发 worker 的 QPS(避免请求过于集中) | -q 10(每个 worker 每秒最多 10 个请求) |
| -cpus | 指定使用的 CPU 核心数(默认使用当前机器所有核心) | -cpus 4(使用 4 个 CPU 核心) |
| -h2 | 启用 HTTP/2 协议(适用于支持 HTTP/2 的接口) | -h2 http://localhost:8080/api/hello |
4.2 高级用法实战示例
示例 1:带请求头和请求体的 POST 压测
模拟 300 个总请求、50 个并发,POST 方法,带 JSON 格式请求头和请求体,压测提交接口:
bash
# 注意:请求体为 JSON 时,需通过 -H 指定 Content-Type 为 application/json
hey -n 300 -c 50 -m POST -H "Content-Type: application/json" -H "Token: abc123456" -d '{"username":"testuser","password":"123456","data":{"id":1001,"name":"测试数据"}}' http://localhost:8080/api/login
适用场景:压测需要身份验证、提交 JSON 数据的接口(如登录、数据提交接口)。
示例 2:从文件读取请求体压测
若请求体较大(如复杂的 JSON、XML 数据),可将请求体写入文件,通过 -D 参数读取,示例如下:
bash
# 1. 先创建请求体文件 request.json(内容如下)
# {
# "username": "testuser",
# "password": "123456",
# "data": {
# "id": 1001,
# "name": "测试数据",
# "desc": "从文件读取请求体,适用于复杂请求"
# }
# }
# 2. 执行压测(读取文件中的请求体)
hey -n 500 -c 80 -m POST -H "Content-Type: application/json" -D ./request.json http://localhost:8080/api/submit
适用场景:请求体复杂、内容较多的场景,避免在命令行中输入过长的请求体,便于维护。
示例 3:带基本身份认证的压测
部分接口需要基本身份认证(用户名+密码),可通过 -a 参数指定,示例如下:
bash
# 模拟 200 个请求、30 个并发,带基本认证(用户名 admin,密码 123456)
hey -n 200 -c 30 -a "admin:123456" http://localhost:8080/api/admin/getInfo
适用场景:压测需要权限验证的后台接口、管理接口。
示例 4:指定代理进行压测
若目标接口需要通过代理访问(如测试环境需要代理、避免本地 IP 被限制),可通过 -x 参数指定代理,示例如下:
bash
# 模拟 100 个请求、20 个并发,通过代理 127.0.0.1:8080 压测
hey -n 100 -c 20 -x "127.0.0.1:8080" http://localhost:8080/api/test
示例 5:限制 QPS 并保存报告到文件
模拟持续 60 秒、50 个并发,限制每个 worker 每秒最多 10 个请求,将压测报告保存为 CSV 文件(便于后续分析):
bash
hey -c 50 -z 60s -q 10 -o ./hey_result.csv http://localhost:8080/api/hello
CSV 文件中会包含每个请求的响应时间、状态码等详细信息,可用 Excel、WPS 打开进行数据分析。
示例 6:动态 URL 压测(社区拓展)
默认情况下,hey 只能对单个固定 URL 进行压测,但社区开发者对其进行了拓展,支持动态 URL(如随机生成 URL 中的参数),示例如下(需使用拓展版本 hey):
bash
# 模拟 10 个请求、2 个并发,动态生成 URL 中的数字参数(十位数 2-9,个位数 1-9)
hey -n 10 -c 2 http://www.baidu.com/{{(2-9)(1-9)}}
运行后会随机生成类似 http://www\.baidu\.com/31、http://www\.baidu\.com/98 的 URL 进行压测,适用于需要测试多个相似 URL 的场景(如不同 ID 的详情接口)。
五、hey 实战场景:模拟真实业务压测
结合实际业务场景,我们以"用户登录接口"为例,演示如何使用 hey 进行完整的压测,覆盖真实业务中的常见需求(带请求头、请求体、身份验证、并发控制),并解读压测结果,指导性能优化。
5.1 实战场景说明
-
目标接口:
http://localhost:8080/api/login(POST 方法,用户登录接口); -
接口要求:请求头需包含
Content\-Type: application/json和App\-Version: 1\.0\.0,请求体为 JSON 格式(用户名、密码); -
压测需求:模拟 1000 个用户登录请求,同时发起 100 个并发,超时时间 15 秒,保存压测报告到 CSV 文件,限制每个 worker 每秒最多 15 个请求;
-
预期结果:接口成功率 100%,QPS ≥ 50,90% 延迟 ≤ 0.5 秒。
5.2 执行压测命令
bash
hey -n 1000 -c 100 -m POST -t 15 -q 15 -H "Content-Type: application/json" -H "App-Version: 1.0.0" -d '{"username":"test_01","password":"test123456"}' -o ./login_test_result.csv http://localhost:8080/api/login
5.3 压测结果解读与优化建议
假设压测结束后,输出的核心报告如下:
bash
Summary:
Total: 18.23 secs
Slowest: 1.20 secs
Fastest: 0.12 secs
Average: 0.45 secs
Requests/sec: 54.85 # QPS = 54.85,满足预期(≥50)
Response time histogram:
0.120 [10] |■■
0.228 [150] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.336 [320] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.444 [280] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.552 [180] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.660 [40] |■■■■■■■■
0.768 [15] |■■■
0.876 [5] |■
0.984 [0] |
1.092 [0] |
1.200 [0] |
Latency distribution:
10% in 0.25 secs
25% in 0.32 secs
50% in 0.43 secs
75% in 0.52 secs
90% in 0.60 secs # 90% 延迟 = 0.6 秒,略高于预期(≤0.5 秒)
95% in 0.72 secs
99% in 0.95 secs
Status code distribution:
[200] 1000 responses # 成功率 100%,满足预期
结果分析
-
优势:接口成功率 100%,QPS 达到 54.85,满足预期需求,说明接口在 100 并发下整体稳定;
-
不足:90% 延迟为 0.6 秒,略高于预期的 0.5 秒,说明部分用户的登录体验有待优化。
优化建议
-
接口层面:优化登录接口的业务逻辑(如减少数据库查询次数、缓存用户信息);
-
服务器层面:增加服务器 CPU、内存资源,或优化服务器配置(如调整 Nginx 连接数);
-
压测优化:可适当降低并发数(如调整为 80),或增加 CPU 核心数(通过 -cpus 参数),观察延迟是否下降。
六、拓展知识:hey 与其他压测工具对比
市面上有很多 HTTP 负载测试工具(如 JMeter、ab、wrk 等),不同工具各有优势,下面将 hey 与主流工具进行对比,帮助你根据场景选择合适的工具:
| 工具 | 开发语言 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| hey | Go | 轻量、高效、并发能力强,命令行操作简单,输出直观,跨平台,支持 HTTP/2 | 无图形界面,不支持复杂场景(如分布式压测) | 快速压测、接口调试、临时压测、CI/CD 集成 |
| JMeter | Java | 图形界面友好,支持复杂场景(如分布式压测、多协议),可生成详细报表 | 资源占用高,配置复杂,启动慢 | 大型项目、复杂场景、长期压测、团队协作 |
| ab(ApacheBench) | C | 轻量、安装简单,适合简单 GET 请求压测 | 功能单一,不支持复杂请求(如 POST、请求头),并发能力有限 | 简单 GET 接口压测、快速验证 |
| wrk | C | 性能极强,支持 Lua 脚本,可定制复杂场景 | 学习成本高,不支持 Windows 系统,配置复杂 | 高性能场景、复杂脚本压测、Linux 环境 |
总结:如果是开发者日常调试、临时压测、简单场景,优先选择 hey(轻量、高效、易上手);如果是大型项目、复杂场景、需要团队协作,可选择 JMeter;如果是 Linux 环境下的高性能压测,可选择 wrk。
七、常见问题与解决方案
使用 hey 过程中,可能会遇到一些常见问题,下面整理了高频问题及解决方案,帮助你快速排查问题。
问题 1:执行 hey 命令提示"command not found"
原因:未配置环境变量,系统无法找到 hey 可执行文件。
解决方案:
-
MacOS/Linux:将 hey 可执行文件移动到 /usr/local/bin/ 目录(如
mv hey /usr/local/bin/); -
Windows:将 hey.exe 所在目录添加到系统 PATH 环境变量中,重启 CMD/PowerShell 即可。
问题 2:压测时出现大量超时(status code 504 或 timeout)
原因:并发数设置过高,服务器无法承载;或接口本身响应较慢;或超时时间设置过短。
解决方案:
-
降低并发数(-c 参数),逐步调整(如从 100 调整为 50);
-
增加超时时间(-t 参数),如设置为 30 秒(
\-t 30); -
排查接口本身的性能问题(如数据库慢查询、代码逻辑繁琐)。
问题 3:POST 请求提示"400 Bad Request"
原因:请求体格式错误;或未指定正确的 Content-Type 请求头;或请求体参数缺失。
解决方案:
-
检查请求体格式(如 JSON 格式是否正确,是否缺少引号、逗号);
-
通过 -H 参数指定正确的 Content-Type(如 JSON 格式指定
\-H \&\#34;Content\-Type: application/json\&\#34;); -
检查请求体参数是否完整,与接口要求一致。
问题 4:压测结果中 QPS 过低
原因:服务器资源不足(CPU、内存、网络);或接口性能较差;或并发数设置过低。
解决方案:
-
增加服务器资源(如升级 CPU、内存,优化网络);
-
优化接口性能(如缓存、减少数据库查询、异步处理);
-
适当增加并发数(-c 参数),但需结合服务器配置,避免过度压垮服务器。
八、总结
hey 作为一款基于 Go 语言开发的开源 HTTP 负载测试工具,凭借轻量、高效、易用的特点,成为开发者日常接口调试和性能验证的首选工具。本文从工具介绍、环境安装、基础用法、高级用法、实战场景、拓展知识到常见问题,全方位讲解了 hey 的使用方法,搭配了大量可直接复制运行的示例代码,兼顾新手入门与进阶需求。
使用 hey 时,核心是根据实际业务场景配置合适的并发数、请求数、请求方法等参数,通过压测报告解读接口性能瓶颈,进而优化接口和服务器配置。需要注意的是,压测时应避免过度压垮生产环境服务器,建议在测试环境进行压测,或控制压测强度。
如果你需要快速验证接口性能、排查高并发问题,不妨试试 hey,相信它能帮你高效完成负载测试,提升 Web 应用的性能和稳定性。同时,hey 是开源项目,你也可以通过修改源码,定制适合自己业务场景的压测功能。