ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Hey作为Go库使用:用Work.Run()编程式构建你自己的压测工具

Hey作为Go库使用:用Work.Run()编程式构建你自己的压测工具 Hey作为Go库使用用Work.Run()编程式构建你自己的压测工具【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/heyhey 是一款用 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/2Output输出格式设为csv时逐条输出 CSV 指标Writer报告输出目标为nil时默认写到标准输出ProxyAddrHTTP 代理地址host:portDisableKeepAlives禁止 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.goInit()初始化内部通道Run()会隐式调用通常无需手动执行Stop()向所有 worker 发送停止信号它们完成手头请求后优雅退出——hey 命令行就是靠它实现 CtrlC 中断与-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),仅供参考
返回列表