在服务正式上线前,我们需要确保服务上线后的可用性和稳定性,因此对系统的处理能力和稳定性进行全面的测试是非常必要的。压力测试是其中重要的一环,本文将介绍如何使用 TarsBenchmark 对 TARS 服务进行压测。
在标准开发流程中,测试贯彻整个流程,包括但不限于单元测试、接口测试、集成测试、压力测试等。其中压力测试是服务上线之前的最后关键一环。
压测是通过不断给服务接口施加压力,测试服务接口性能,验证服务的处理能力和稳定性。我们可以通过压测对服务的性能进行评估,比如服务最大并发量、可以同时服务用户数等。最后根据测试指标对服务合理部署、扩缩容,或是对发现的性能瓶颈进行优化。
TarsBenchmark 是基于 TARS 生态的一个压测工具,主要用于 TARS 服务的压力测试。并且支持与 TarsWeb 结合使用,提供友好的操作界面对服务进行测试。下面将介绍如何使用 TarsBenchmark 对服务进行测试。
TarsBenchmark 中包含 NodeServer
, AdminServer
两个服务。
NodeServer
: 为压测节点服务,用于压测的具体执行,对其他服务进行压测。可以在多个节点上部署,从而实现并行压测;
AdminServer
: 用于管理压测节点,即管理 NodeServer
,类似于 TARS 框架服务中的主控服务。我们先来看看怎么安装 TarsBenchmark。
首先,下载 TarsBenchmark 源码
git clone https://github.com/TarsCloud/TarsBenchmark.git
TarsBenchmark 中提供了一键安装脚本,能够通过脚本直接将 TarsBenchmark 发布在 TarsWeb 上,在 TarsWeb 中集成压测功能,执行命令如下
./install.sh $WebHost $Token $AdminIP $NodeIP
其中,参数
WebHost
为 TarsWeb 部署地址;Token
为在 TarsWeb 用户系统中生成的 Token,能够在
http://${WebHost}/auth.html#/token
中新增并获取;AdminIP
为要部署 AdminServer
的节点;NodeIP
为要部署 NodeServer
的节点。例如,TarsWeb 部署地址为 192.168.123.128:3000
,并要将 AdminServer
部署在节点 192.168.123.128
,NodeServer
部署在节点 192.168.123.128
,部署命令如下
cd TarsBenchmark./install.sh 192.168.123.128:3000 abc123efg456ijk789 192.168.123.128192.168.123.128
执行完成后,在 TarsWeb 上看到 benchmark
应用下包含服务 AdminServer
和 NodeServer
,即安装成功,如下
成功安装后 TarsBenchmark 后,就可以在 TarsWeb 上对服务进行压测了。接下来我们将以 HelloServer
服务为例,了解如何对服务进行压测。
首先,我们需要定义 HelloServer
的接口
// Hello.tarsmoduleDemo{interfaceHello{int testHello(string req, outstring rsp);};};
我们打开 HelloServer
服务的管理界面,点击 Tab 栏的 接口调试
跳转到接口调试页面。如未上传服务 tars
接口文件,点击 添加
来上传。最后点击压测,即可打开压测界面。步骤如下图
点击 压测
后,跳转到压测界面,如下
可以看到函数列表中仅有一个我们在接口中定义了的函数 testHello
,点击页面中的入参结构和出参结构展开,如下图
可以看到,testHello
的入参和出参都是 string
字符串类型,和 HelloServer
接口文件中的定义是对应的。
点击用例
后,会在 函数列表
下方显示该函数测试用例列表。如果是第一次添加,这里打开的列表会是空的,如下图
我们点击 添加用例
,在弹出窗口中给函数添加测试用例,传入参数为字符串 hello
,如下
点击 确定
后,就能在用例列表中看到我们添加的用例
点击 压测
,会弹出压测配置界面,如下
我们勾选 endpoints
中要测试的节点,这里 HelloServer
只部署了一个节点,因此只显示了一个。其他选项
1
,表示只建立一个连接;100
,即每秒请求 100
次,可以通过增大该速率增加请求压力;20
秒。配置完毕后,点击 开始压测,即弹出压测进行界面,显示本次压测的指标,如下
这样我们就通过 TarsBenchmark 完成了对 HelloServer
的压测。
前面例子中,我们只介绍了 string
类型,并只是简单地添加了一个固定值作为测试用例。实际情况中,参数类型通常会比较复杂。TarsBenchmark 不仅支持 tars 协议中使用的数据类型,还针对部分数据类型支持随机参数生成。具体支持的数据类型可以参考官方文档 tars通信协议 (文末附链接)。
对于常用的 int
, string
, vector
, map
这几个类型,添加用例的方式如下
// int"a": 1// string"a": "string"// vector<int>"a": [1,2,3,4]// map<string, string>"a": {"test": "abc"}
特别地,为了规避压测过程中的热key效应,避免后端请求落到同一台单机上,TarsBenchmark 支持对整型和 string
类型生成随机内容。目前支持两种随机方式:
"[1-100]"
,表示在随机选择 1
到 100
的数字;"[a,b,c,111]"
,表示在 a
, b
, c
, 111
中随机选择;*热key效应:部分业务场景下,后端会缓存热key,将包含热 key 的请求定向到特定服务器单机上的服务。
下面我们通过前面 HelloServer
的例子,来看看具体如何使用。
首先对于 HelloServer
,我们新增定义一个结构体 TestPacket
,其中包含了类型为 int
, string
, vector
, map
的四个字段 a
, b
, c
, d
。同时新增一个接口 testType
,入参和出参都为 TestPacket
类型,如下
moduleDemo{structTestPacket{ 1requireint a = 0; 2requirestring b = ""; 3require vector<int> c; 4require map<string, string> d;};interfaceHello{ int testHello(string req, outstring rsp); int testType(TestPacket input, outTestPacket output);};};testType
接口的实现如下,可以看到,只是简单地打印日志,并将传入参数直接赋值给出参 output
intHelloImp::testType(constDemo::TestPacket& input, Demo::TestPacket& output, tars::TarsCurrentPtr current){ TLOGINFO("HelloImp::testType| a: "<< input.a << " | b: " << input.b << " | c[0]: " << input.c[0] << " | d[test]: " <<(input.d.count("test")? input.d.at("test") : "") << endl); output = input;return0;}
服务部署后,我们需要先在 接口调试
页面重新上传 tars
文件。上传完成后,打开压测界面,即可在函数列表中看到 testHello
和 testType
两个函数。
接下来,和前面的示例一样需要添加测试用例。我们点击 添加用例
,会默认提供用例入参的结构,如下图
接下来我们编写用例,这里对于整型和 string
类型,我们使用前面提到的两种随机方式。用例如下
{ "input": { "d": { "test": "hello", "a": "b" }, "c": [ 2, 32 ], "b": "[test,hello,awsl]", "a": "[22-100]" }}
最后进行压测,结束后查看服务的日志,如下图。
可以发现 a
和 b
的值都是随机变化的,这样压测过程的请求不会都落在同一服务器单机上,确保了压测结果的准确性。
本文介绍了 TARS 服务的压测利器 TarsBenchmark,结合 TarsWeb ,集成压测功能,方便开发者对 TARS 服务进行压测,验证服务的处理能力和稳定性。
TARS 可以在考虑到易用性和高性能的同时快速构建系统并自动生成代码,帮助开发人员和企业以微服务的方式快速构建自己稳定可靠的分布式应用,从而令开发人员只关注业务逻辑,提高运营效率。多语言、敏捷研发、高可用和高效运营的特性使 TARS 成为企业级产品。
附文中链接:
tars通信协议:https://tarscloud.github.io/TarsDocs/base/tars-protocol.html
TARS基金会是Linux基金会下的非营利性、微服务基金会,致力于建设一个强大而灵活的微服务生态系统。无论你在哪个行业,无论你使用什么技术栈,这里能助你快速实现你的创意。