【工具推荐定制开发】一款轻量的批量web请求命令行工具支持全平台:hey,基本安装、配置、使用

背景
在开发 Web 应用的过程中,作为开发人员,为了确认接口的性能能够达到要求,我们往往需要一个接口压测工具,帮助我们快速地对我们所提供的 Web 服务发起批量请求。在接口联调的过程中,我们通常会用 Postman 等图形化工具来构造对应的请求并调试接口。但是,如果要做批量的请求,并且希望能展示出对应的统计信息,还是需要通过专门的工具才行。

Hey 就是一款非常适合该场景的命令行工具,它由 go 语言编写,并且在 Github 上已开源。Hey 能够并发地运行所提供的请求数并打印统计信息,还支持 HTTP2 站点。

本文将介绍 Hey 的基本安装使用,社区用户基于 Hey 的功能扩展,以及笔者基于自己的需求场景所做的定制化开发工作。

在这里插入图片描述

hey
Hey的安装也非常简单,可以直接在其 GIthub 的项目主页上进行下载。对于 macOS 的用户则更加简单,可以直接通过 brew install hey 进行安装。

https://github.com/rakyll/hey

安装完成后,我们只需要在命令行中敲入对应的命令,就可以实现对某个 url 的批量调用,而且 Hey 支持了大量的参数,让调用者可以进行自定义。用法和选项如下:

Usage: hey [options...] <url>Options:
-n  要运行的请求数。默认值为200-c  要同时运行的工作程序数。总请求数不能小于并发级别。默认值为50-q  每个工作程序的查询每秒(QPS)速率限制。默认值为无速率限制。
-z  发送请求的应用程序持续时间。达到持续时间后,应用程序将停止并退出。如果指定了持续时间,则忽略n。示例:-z 10s -z 3m。
-o  输出类型。如果未提供,则打印摘要。 "csv"是唯一支持的替代方案。以逗号分隔的值格式转储响应指标。
-m  HTTP方法之一:GET、POST、PUT、DELETE、HEAD、OPTIONS。
-H  自定义HTTP标头。您可以通过重复标志指定尽可能多的标头。例如,-H“Accept:text / html”-H“Content-Type:application / xml”。
-t  每个请求的超时时间(以秒为单位)。默认值为20,使用0表示无限制。
-A  HTTP接受标头。
-d  HTTP请求正文。
-D  HTTP请求正文来自文件。例如,/ home / user / file.txt或./ file.txt。
-T  内容类型,默认为"text / html"-a  基本身份验证,用户名:密码。
-x  HTTP代理地址为主机:端口。
-h2 启用HTTP / 2-host HTTP主机标头。
-disable-compression 禁用压缩。
-disable-keepalive 禁用保持活动,防止在不同的HTTP请求之间重用TCP连接。
-disable-redirects 禁用HTTP重定向的跟随
-cpus 使用的CPU核心数。 (当前机器的默认值为8个核心)

下面举一个简单的例子,比如我们希望批量请求百度的主页,只需要执行下列命令:

hey -n 10 -c 2 http://www.baidu.com/

我们就以每次 2 个请求并发发送,发送 5 次访问 baidu.com 的站点,并能得到一份统计报告:

Summary:Total:	0.8334 secsSlowest:	0.3334 secsFastest:	0.0776 secsAverage:	0.1611 secsRequests/sec:	11.9987Response time histogram:0.078 [1]	|■■■■■■■■■■■■■0.103 [2]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■0.129 [1]	|■■■■■■■■■■■■■0.154 [1]	|■■■■■■■■■■■■■0.180 [3]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.205 [0]	|0.231 [0]	|0.257 [0]	|0.282 [0]	|0.308 [1]	|■■■■■■■■■■■■■0.333 [1]	|■■■■■■■■■■■■■Latency distribution:10% in 0.0795 secs25% in 0.1057 secs50% in 0.1592 secs75% in 0.2951 secs90% in 0.3334 secs0% in 0.0000 secs0% in 0.0000 secsDetails (average, fastest, slowest):DNS+dialup:	0.0005 secs, 0.0776 secs, 0.3334 secsDNS-lookup:	0.0004 secs, 0.0000 secs, 0.0022 secsreq write:	0.0000 secs, 0.0000 secs, 0.0001 secsresp wait:	0.0811 secs, 0.0394 secs, 0.1822 secsresp read:	0.0794 secs, 0.0330 secs, 0.1483 secsStatus code distribution:[200]	10 responses

可见,统计报告里面包含了各种信息,包括最快/最慢的请求耗时,请求耗时的分布,所有请求响应状态码的分布等等,能够很好很快地帮我们对 Web 服务的性能有一个大致的了解,从而做进一步的优化。

支持 url 中字段正则的 hey
虽然默认的 Hey 足够简单且配置选项丰富,但是它每次命令仅仅能针对一个 url 进行请求和统计分析。

有多名社区开发者在 Github Issue 中提到一个类似问题,那就是希望能够实现一定程度的 URL 动态化,让批量请求不只落在一个 url 上,而是支持调用者进行一些动态设置。

比如说,有社区开发者 preslavrachev 就在 url 中加入了正则的支持,让 url 能够在满足正则配置的情况下进行动态随机生成。举个例子:

hey -n 10 -c 2 http://www.baidu.com/{{[2-9][1-9]}}

统计报告如下,可以看到,url 都满足数字的十位数是 2-9,个位数是 1-9,而且是随机生成的,请求响应都是 404 也符合预期:

http://www.baidu.com/31
http://www.baidu.com/31
http://www.baidu.com/98
http://www.baidu.com/72
http://www.baidu.com/87
http://www.baidu.com/68
http://www.baidu.com/77
http://www.baidu.com/39
http://www.baidu.com/96
http://www.baidu.com/75Summary:Total:        0.3644 secsSlowest:      0.1597 secsFastest:      0.0463 secsAverage:      0.0726 secsRequests/sec: 27.4439Total data:   2000 bytesSize/request: 200 bytesResponse time histogram:0.046 [1]     |■■■■■■■0.058 [6]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.069 [1]     |■■■■■■■0.080 [0]     |0.092 [0]     |0.103 [0]     |0.114 [0]     |0.126 [0]     |0.137 [0]     |0.148 [0]     |0.160 [2]     |■■■■■■■■■■■■■Latency distribution:10% in 0.0473 secs25% in 0.0492 secs50% in 0.0529 secs75% in 0.1563 secs90% in 0.1597 secs0% in 0.0000 secs0% in 0.0000 secsDetails (average, fastest, slowest):DNS+dialup:   0.0202 secs, 0.0463 secs, 0.1597 secsDNS-lookup:   0.0117 secs, 0.0000 secs, 0.0584 secsreq write:    0.0001 secs, 0.0000 secs, 0.0010 secsresp wait:    0.0517 secs, 0.0461 secs, 0.0622 secsresp read:    0.0001 secs, 0.0000 secs, 0.0003 secsStatus code distribution:[404] 10 responses

【定制开发】支持 url 中 ID 自增的 ihey
刚好,笔者在做压测的时候,url 有一个 id 的动态字段,虽然社区开发者提供的正则方法,但是笔者的场景是一次性创建一大批任务,然后通过批量的调用来进行执行,在这种场景下,随机生成会导致大量的重复请求,而执行过的任务是不允许再次执行的,所以会有问题,所以,笔者的场景需要的是一种能支持数字自增的动态 url。

既然现有的实现无法支持,那么就只能自己做定制开发。笔者对原仓库进行了 fork,同时根据自己的需要进行了定制开发,让这个工具支持了数字自增的动态 url,让我们来看看最终的效果。

为了跟原来的 hey 命令区分开,这里笔者将命令改成 ihey(increase hey),并且已经将可执行文件上传到仓库,可以直接下载执行。命令如下:

ihey -n 10 -c 2 http://some_api/{{20:}}

因为是基于上面 preslavrachev 的修改进行的二次开发,所以这里标识符号依然是{{}},为了标识出是从某个数字开始的,这里就使用了{{number:}},这里的 number 仅支持正整数。

统计报告如下,可以看到,请求 url 从 20 开始,每两个是一组,所以两两的顺序是不确定的,但是总的是从 20-29递增,符合我们的预期。

http://www.baidu.com/21
http://www.baidu.com/20
http://www.baidu.com/22
http://www.baidu.com/23
http://www.baidu.com/24
http://www.baidu.com/25
http://www.baidu.com/26
http://www.baidu.com/27
http://www.baidu.com/28
http://www.baidu.com/29Summary:Total:        0.2404 secsSlowest:      0.0886 secsFastest:      0.0341 secsAverage:      0.0474 secsRequests/sec: 41.5902Total data:   2000 bytesSize/request: 200 bytesResponse time histogram:0.034 [1]     |■■■■■■■■0.040 [5]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.045 [2]     |■■■■■■■■■■■■■■■■0.050 [0]     |0.056 [0]     |0.061 [0]     |0.067 [0]     |0.072 [0]     |0.078 [0]     |0.083 [0]     |0.089 [2]     |■■■■■■■■■■■■■■■■Latency distribution:10% in 0.0360 secs25% in 0.0372 secs50% in 0.0389 secs75% in 0.0839 secs90% in 0.0886 secs0% in 0.0000 secs0% in 0.0000 secsDetails (average, fastest, slowest):DNS+dialup:   0.0095 secs, 0.0341 secs, 0.0886 secsDNS-lookup:   0.0007 secs, 0.0000 secs, 0.0035 secsreq write:    0.0000 secs, 0.0000 secs, 0.0001 secsresp wait:    0.0375 secs, 0.0340 secs, 0.0406 secsresp read:    0.0001 secs, 0.0000 secs, 0.0001 secsStatus code distribution:[404] 10 responses

总结
本文主要介绍了以下的内容:

一款方便轻量的 api 批量请求工具:hey
社区开发者基于 hey 所做的 url 动态化优化,支持在 url 中通过正则表达式让 hey 随机请求 url。
笔者基于 hey 和社区开发者进行了定制化开发:ihey,让 hey 支持 url 中配置可自增的数字路径,从而达到可预期的动态 url 批量请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/679601.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVC与MVVM架构模式

1、MVC MVC&#xff1a;Model-View-Controller&#xff0c;即模型-视图-控制器 MVC模式是一种非常经典的软件架构模式。从设计模式的角度来看&#xff0c;MVC模式是一种复合模式&#xff0c;它将多个设计模式结合在一种解决方案中&#xff0c;从而可以解决许多设计问题。 MV…

C++:类与对象—继承

类与对象—继承 一、继承是什么&#xff1f;二、继承定义三、基类和派生类对象赋值转换四、继承中的作用域五、派生类的默认成员函数六、继承与友元七、继承与静态成员八、复杂的菱形继承及菱形虚拟继承九、继承的总结和反思十、考察重点 一、继承是什么&#xff1f; 继承(inh…

威客网上招标系统(五)

目录 5 详细设计 5.1 系统首页 5.1.1系统首页&#xff08;网站首页index.jsp&#xff09; 5.1.2 下沙派威客网首页界面说明 5.2 站内新闻信息 5.2.1站内新闻操作界面 5.2.2系统主操作界面说明 5.3威客在线操作界面 5.3.1 威客在线操作界面 5.3.2威客在线说明 5.4系统…

ssrf初步

一&#xff0c;简介 全称&#xff1a;Server-Side Request Forgery&#xff08;中文&#xff1a;服务器端请求伪造&#xff09; 攻击者从服务端发起请求&#xff0c;让服务器连接任意外部系统&#xff0c;从而泄露敏感数据。主要利用各种协议的请求伪造&#xff0c;例如php协…

KMP + Compose 跨平台 Android IOS 实战入门

KMP&#xff08;Kotlin Multiplatform&#xff09;是一种面向移动端开发的跨平台框架&#xff0c;使用 Kotlin 语言编写&#xff0c;可实现在 Android 和 iOS 平台上共享代码和逻辑。通过 KMP 框架&#xff0c;我们可以编写一次代码&#xff0c;然后在不同的平台上进行部署和运…

20240430,类模板案例-数组类封装,STL初识,STRING容器(构造函数,赋值)

我真的碎掉了&#xff0c;主要是我很缺那点钱啊现在&#xff0c;我真的碎掉了我碎掉了碎掉了碎掉了 目录 0.8 类模板案例-数组类封装 myarray.hpp a.cpp 一&#xff0c;STL初识 1.1 STL基本概念 1.2 vector 存放内置数据 1.3 vector存放自定义数据(及指针类型&#xf…

Java中的异常处理机制

Java中的异常处理机制主要通过try、catch和finally三个关键字来实现。以下是Java异常处理机制的工作原理和正确处理异常的一些基本步骤&#xff1a; ## 异常处理机制的工作原理 1. **try**&#xff1a;包围可能抛出异常的代码块。 2. **catch**&#xff1a;捕获并处理特定类型…

CoroNa Green,可用于细胞内或细胞外环境中NA+浓度的测量

引言&#xff1a;在化学研究的海洋中&#xff0c;优质的化学试剂是实验成功的关键。今天&#xff0c;我要为大家分享一款备受好评的化学试剂——CoroNa Green。这款试剂以其独特的性能和广泛的应用领域&#xff0c;赢得了众多科研人员的青睐。 CoroNa Green是一种常用的钠离子荧…

OpenHarmony实战开发——引入开源C/C++库之Har包里的NDK

Har 包 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块…

Clion STM32CubeMX 项目

系列文章目录 前言 最后修改 2024 年 4 月 16 日 操作系统&#xff1a;Windows / Linux / macOS 所需工具 STM32CubeMX、GNU ARM 工具链 项目格式&#xff1a; CMake 兼容配置&#xff1a; OpenOCD 运行与调试/嵌入式 GDB 服务器 对于以 STM32 板卡为目标的嵌入式项目&#xf…

联发科天玑AI开发套件亮相:开发智能终端生成式AI应用的全面工具

在今日召开的天玑开发者大会2024&#xff08;MDDC 2024&#xff09;上&#xff0c;联发科向外界展示了其最新力作——天玑AI开发套件。该套件是为合作伙伴提供终端生成式AI应用开发的一站式工具包&#xff0c;意在简化并加速开发过程。 联发科推出的天玑AI开发套件包括四大核心…

Unity数据持久化之Json

Json概述 Json是什么? 全称:JavaScript对象简谱(JavaScript Object Notation) Json是国际通用的一种轻量级的数据交换格式 主要在网络通讯中用于传输数据,或本地数据存储和读取 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率 我们一般使用Json文件来…