Hey压测内网微服务:127.0.0.1、端口映射与集群IP的完整实战方案
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
Hey 是一款用 Go 编写的轻量级 HTTP 压测工具,ApacheBench(ab)的现代替代品,支持并发 Worker、QPS 限速、按持续时间压测和 CSV 导出。本文带你用 Hey 压测内网微服务,完整覆盖127.0.0.1 本机直连、Docker 端口映射、Kubernetes ClusterIP三种最常见的内网寻址方式,让你一条命令就能得到 QPS、延迟分位数和分阶段耗时报告。
为什么内网微服务压测适合用 Hey
内网压测的核心诉求是:免依赖、可定制请求头、能定位慢在哪。Hey 恰好都满足:
- 🚀单文件静态二进制,无任何运行时依赖,丢到内网任何 Linux/macOS 机器即可运行;
- 🎯三种寻址全覆盖:
127.0.0.1本机、host:映射端口、集群 IP / VIP; - 🔍分阶段耗时拆解:DNS 解析、TCP 建连、请求写入、响应等待、响应读取各自统计均值/最快/最慢,快速判断"慢在网络还是服务本身";
- 🧩贴近真实业务:支持自定义 Header、Basic 认证、请求体文件、HTTP/2、代理,适配虚拟主机路由的微服务网关。
参数定义在 hey.go,压测引擎(Worker 调度、连接池复用)实现在 requester/requester.go,报告统计逻辑在 requester/report.go。
一键安装 Hey 的三种方式
方式一:包管理器(macOS)
brew install hey方式二:克隆仓库源码构建(跨平台通用)
git clone https://gitcode.com/GitHub_Trending/he/hey cd hey go build -o hey .方式三:用仓库内置 Dockerfile 构建镜像
git clone https://gitcode.com/GitHub_Trending/he/hey cd hey docker build -t hey:local .镜像基于 Dockerfile 构建,最终产物是一个scratch极简镜像,入口即hey命令,非常适合在无外网的内网节点上分发使用。发布用的多平台构建脚本可参考 Makefile。
第一步:127.0.0.1 本机微服务压测
假设你的微服务在本机8080端口监听,先用 curl 确认接口可用:
curl -i http://127.0.0.1:8080/ping然后是最基本的压测——默认 200 个请求、50 个并发:
hey http://127.0.0.1:8080/ping三种常用压测形态:
# 1) 固定请求数:1000 个请求、100 并发 hey -n 1000 -c 100 http://127.0.0.1:8080/ping # 2) 固定持续时间:压 30 秒(此时 -n 被忽略,Ctrl+C 可随时优雅停止) hey -z 30s -c 50 http://127.0.0.1:8080/ping # 3) 限速压测:每 Worker 100 QPS、5 个 Worker,共 500 QPS hey -q 100 -c 5 -z 1m http://127.0.0.1:8080/ping💡内网小经验:压测本机服务时 CPU 开销会被计入同一台机器,建议加-cpus 4之类参数限制 hey 使用的核心数,给被测服务留出资源。
第二步:端口映射场景压测(Docker / 开发服务器)
微服务跑在容器里、宿主机通过-p映射端口时,压测目标是127.0.0.1:映射端口:
docker run -d -p 8080:9000 myservice:latest # 压测宿主机映射端口 hey -c 50 -z 30s http://127.0.0.1:8080/api/hello这个场景有两个高频坑:
1) 网关按 Host 路由时,用-host重写请求头
容器内服务或前置网关常按Host头做虚拟主机匹配。URL 填映射地址,但把Host声明成服务域名,路由和证书校验(hey 默认跳过证书验证)就都能正常工作:
hey -host "user-service.internal" -c 50 -z 30s http://127.0.0.1:8080/api/hello2) 想量化 TCP 建连成本,关掉连接复用
默认情况下 hey 会复用 keep-alive 连接(空闲连接池上限 500,见 requester/requester.go)。对比一次-disable-keepalive的结果,就能看出端口映射链路上新建连接的开销占比:
hey -disable-keepalive -c 50 -z 10s http://127.0.0.1:8080/api/hello第三步:集群 IP / VIP / ClusterIP 压测
生产内网中,微服务通常由负载均衡 IP(VIP)、Kubernetes Service 的 ClusterIP 或 Ingress 集群入口提供服务。压测这类入口时,核心参数组合如下:
# 对 ClusterIP 压测,并用 -host 命中正确的虚拟主机 hey -host "order-service.internal" \ -c 100 -z 2m \ http://10.96.0.10:8080/v1/orders/health # 需要走内网代理时,追加 -x 指定 host:port hey -x 127.0.0.1:3128 -c 50 -z 30s http://10.96.0.10:8080/v1/orders/health # 带鉴权的接口 hey -a "tester:s3cret" -H "X-Request-Source: loadtest" \ -c 50 -z 1m http://10.96.0.10:8080/v1/orders/health针对集群入口的实用开关:
| 参数 | 内网压测中的作用 |
|---|---|
-host <域名> | URL 指向 ClusterIP/VIP,Host头仍声明服务域名,保证虚拟主机路由正确 |
-x host:port | 请求经由内网 HTTP 代理转发 |
-disable-redirects | 入口返回 302 时不跟随,直接统计原始状态码分布 |
-t 5 | 单请求超时 5 秒(默认 20),避免慢节点拖垮整轮统计 |
-cpus 8 | 控制 hey 自身占用的 CPU 核数 |
📌多机放大流量:ClusterIP 压测需要更高 QPS 时,在多台压测机跑同一条hey命令即可线性叠加,每台机器的Requests/sec相加就是集群入口的真实吞吐。
常用参数速查表
| 参数 | 说明 | 示例 |
|---|---|---|
-n | 总请求数(默认 200) | hey -n 1000 |
-c | 并发 Worker 数(默认 50) | hey -c 100 |
-z | 压测持续时间,设置后忽略-n | hey -z 30s |
-q | 每 Worker QPS 限速 | hey -q 100 -c 5 |
-m/-d/-D | HTTP 方法 / 内联请求体 / 文件请求体 | hey -m POST -d '{"uid":1}' |
-H | 自定义 Header,可重复使用 | hey -H "Authorization: Bearer xx" |
-a | Basic 认证user:pass | hey -a u:p |
-host | 改写 HTTP Host 头 | hey -host api.internal |
-x | HTTP 代理地址 | hey -x 127.0.0.1:3128 |
-t | 单请求超时秒数(0 为不限) | hey -t 5 |
-h2 | 启用 HTTP/2(需 HTTPS) | hey -h2 https://... |
-o csv | 逐请求导出 CSV | hey -o csv -c 10 > out.csv |
-disable-keepalive | 禁用连接复用 | 对比建连开销 |
完整选项列表见 README.md 或运行hey -h。
读懂 Hey 的压测报告
跑完一次压测,终端输出四段核心信息(默认模板定义在 requester/print.go):
- Summary 汇总:总耗时、最快/最慢/平均响应时间、Requests/sec(实测吞吐);
- Response time histogram:响应时间直方图,一眼看出延迟分布是集中还是长尾;
- Latency distribution:
90% in 0.0021 secs这样的分位数,内网压测重点盯99%那一行; - Details 分阶段明细:
DNS+dialup(建连)、DNS-lookup(解析)、req write(写请求)、resp wait(首字节等待)、resp read(读响应)各自的均值/最快/最慢。
🔎判读技巧:DNS-lookup几乎为 0 说明直连 IP 生效;DNS+dialup偏高而resp wait正常,问题多半在端口映射链路或负载均衡建连;resp wait独占大头则说明瓶颈在服务本身处理逻辑。
需要留档或二次分析时,用 CSV 模式导出(8 列:response-time、DNS+dialup、DNS、Request-write、Response-delay、Response-read、status-code、offset,格式说明见 requester/print.go):
hey -c 50 -n 500 http://10.96.0.10:8080/api/hello -o csv > result.csv内网压测最佳实践清单
- ✅ 用
-z固定持续时间压测,避免"请求数跑完才停"导致各轮数据不可比; - ✅ 关键接口先小规模(
-n 200 -c 20)冒烟,确认 200 状态码占主体后再拉高-c; - ✅ 网关按域名路由时,务必
-host声明真实服务域名; - ✅ 压测机与被测集群分置不同节点,排除本机 CPU/网络争抢;
- ✅ 出现异常想立即停掉时直接
Ctrl+C,hey 收到中断信号会优雅停止并照常输出已采集的统计(信号处理见 hey.go); - ✅ 结果用
-o csv落盘,便于对比不同容量配置(并发数、核心数、keep-alive 开关)。
掌握 127.0.0.1、端口映射与集群 IP 这三种目标的压测套路后,无论微服务部署在裸机、容器还是 K8s 集群里,Hey 都能一条命令给出可信的吞吐与延迟基线,成为内网容量规划与发布前验收的标配工具。
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考