背景技术
测试一个后台服务,最重要的是模拟客户端。模拟客户端不可避免的面临三个问题:客户端的数量、客户端的并发和客户端的分散。
目前测试人员解决上述三个问题,有两种方式:一是编写脚本,模拟发包;一是采用开源软件,模拟并发。编写脚本对测试人员提出技术要求,且针对不同协议的服务端脚本不同,每次均需编写客户端模拟脚本。除脚本编写要求外,采用脚本模拟,对客户端的分散并不是好的选择。
市面上有开源软件,单开源软件模拟需要学习的过程,一般对技术有所有求,且通常也是要编写对应的脚本来适应后端服务的测试。
本发明就是用来解决此问题的,简单地讲就是,测试后端服务,解决需要同时在几台机器上启用几个客户端的问题。
本发明采用的软件基础技术和术语解释如下:
docker——一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker-py——docker中的一个工具模块,提供丰富的配置API。
mongodb——一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
压测——即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。一般针对网络游戏压力测试从传统的意义来讲是对网络游戏的服务器不断施加“压力”的测试,是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。一款网络游戏在上市前,游戏研发团队或运营商是会对其进行游戏压力测试的,目的是为了了解游戏服务器的承受能力。以便更好的有目的的进行运营或研发。主要检测游戏服务器的承受能力,包括用户承受能力(多少用户同时玩基本不影响质量)、流量承受等。
发明内容
为了解决上面提出的技术问题,提出分布式客户端模拟方法及装置。
本发明的技术方案一方面提供一种分布式客户端模拟方法。所述方法包括以下步骤:
页面配置步骤,利用基于flask搭建的web服务,将压测相关的配置数据与后台交互,使后台通过分布式文件存储数据库保存所述压测相关的配置数据,创建容器;
服务部署步骤,利用应用容器引擎工具包的API,操作容器的创建、部署、启动和结束工作;以及
服务管理步骤,提供每个机器上的客户端的启动、查看或停止服务。
进一步,所述页面配置步骤包括:封装客户端代码,将客户端程序直接打包成docker镜像;根据页面提示,填写容器信息,指定镜像与指定镜像启动的命令;根据镜像的允许规则,获取该镜像所允许部署的机器。
进一步,根据实际情况调整启动方式,配置每个容器相同的启动命令,或者为多个容器指定多个命令以创建封闭的客户端运行环境。
进一步,所述服务部署步骤包括:根据前面步骤获得的容器信息,使用docker-py提供的容器接口,将客户端容器部署至配置的机器群上,并启动指定的客户端命令。
进一步,所述服务管理步骤包括:通过远程接口,通过一键启动的方式启动同一镜像的容器服务,实现对服务端的并发请求;提供页面查询各个机器容器信息以及客户端压力情况;或者通过远程接口,通过一键终止的方式,停止客户端的压测请求。
本发明的技术方案第二方面提供一种分布式客户端模拟装置。该装置包括:
页面配置模块,用于利用基于flask搭建的web服务,将压测相关的配置数据与后台交互,使后台通过分布式文件存储数据库保存所述压测相关的配置数据,创建容器;
服务部署模块,用于利用应用容器引擎工具包的API,操作容器的创建、部署、启动和结束工作;以及
服务管理模块,用于提供每个机器上的客户端的启动、查看或停止服务。
进一步,所述页面配置模块包括:镜像制作子模块,用于封装客户端代码,将客户端程序直接打包成docker镜像;容器创建子模块,用于根据页面提示,填写容器信息,指定镜像与指定镜像启动的命令;镜像机器配置获取子模块,用于根据镜像的允许规则,获取该镜像所允许部署的机器。
进一步,所述服务部署模块包括:分布式部署子模块,用于根据获得的容器信息,使用docker-py提供的容器接口,将客户端容器部署至配置的机器群上,并启动指定的客户端命令。
进一步,所述服务管理模块包括:启动功能子模块,用于通过远程接口,以一键启动的方式启动同一镜像的容器服务,实现对服务端的并发请求;查看功能子模块,用于提供页面查询各个机器容器信息以及客户端压力情况;或者请求停止模块,用于通过远程接口,以一键终止的方式,停止客户端的压测请求。
本发明的技术方案第三方面提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的分布式客户端模拟方法。
本发明的有益效果在于:极大方便测试流程,针对部分项目的客户端压力测试,可以做到客户端的随机并发,与一键管理,配置方便;利用docker技术,使测试客户端实现容器化;实现压测机器配置化,使测试人员无需关心后台机器,只需要配置压测量即可。
具体实施方式
本发明的方案主要分为页面配置、服务部署、服务管理三个方面,其主要采用docker+flask+mongodb+docker-py实现。
图1所示为根据本发明的方法流程示意图。其中的步骤解释如下。
页面配置:压测相关配置(压测镜像、启动命令、客户端数量等)均采用flask搭建的web服务与后台交互。后台采用mongodb保存压测相关的配置,保证配置的灵活性。
服务部署:采用docker-py提供的API,操作容器的创建、部署、启动与结束,进而实现客户端的分布、管理与并发。
服务管理:对服务部署的功能进行统一管理,方便日后维护。
更具体地,整体流程如下:
S1、镜像制作,这一步就是简单的封装客户端代码,即将客户端程序直接打包成最简单docker镜像,将代码包含进来,无需做其他的冗余操作;
S2、创建容器,根据页面提示,填写容器信息,最主要是指定镜像与镜像启动的命令。启动命令这里是灵活多变的,既可以每个容器一样,也可以根据实际情况实现启动方式的不同。这里指定几个命令,就创建几个容器,即创建一个封闭的客户端运行环境;
S3、获取镜像机器配置,这一步主要是根据镜像,获取该镜像所允许部署的机器。如A镜像只允许部署指定的四台机器,实际上每个镜像都会有不同机器列表的配置,方便不同服务对硬件的要求;
S4、分布式部署,根据上一步的容器信息,使用docker-py提供的容器接口,将客户端容器部署至配置的机器群上,并启动指定的客户端命令。这一步完成客户端的分布式部署;
S5、启动,通过远程接口,一键启动同一镜像的容器服务,即启动各个机器上的客户端,实现对服务端的并发请求;
S6、查看,提供页面查询各个机器容器情况,即客户端压力情况。以便调成各个机器的资源配置;
S7、停止,通过远程接口一键终止容器,即一键停止客户端的压测请求。
通过上边的7个步骤,就可以高效部署、启动、观察、终止压测客户端,减轻压测客户端部署的繁琐过程。
图2所示为根据本发明装置的方框示意图。所述装置包括:页面配置模块,用于利用基于flask搭建的web服务,将压测相关的配置数据与后台交互,使后台通过分布式文件存储数据库保存所述压测相关的配置数据,创建容器;服务部署模块,用于利用应用容器引擎工具包的API,操作容器的创建、部署、启动和结束工作;以及服务管理模块,用于提供每个机器上的客户端的启动、查看或停止服务。其中所述页面配置模块进一步包括:镜像制作子模块,用于封装客户端代码,将客户端程序直接打包成docker镜像;容器创建子模块,用于根据页面提示,填写容器信息,指定镜像与指定镜像启动的命令;镜像机器配置获取子模块,用于根据镜像的允许规则,获取该镜像所允许部署的机器。
所述服务部署模块进一步包括:分布式部署子模块,用于根据获得的容器信息,使用docker-py提供的容器接口,将客户端容器部署至配置的机器群上,并启动指定的客户端命令。
所述服务管理模块进一步包括:启动功能子模块,用于通过远程接口,以一键启动的方式启动同一镜像的容器服务,实现对服务端的并发请求;查看功能子模块,用于提供页面查询各个机器容器信息以及客户端压力情况;或者请求停止模块,用于通过远程接口,以一键终止的方式,停止客户端的压测请求。
在本发明的具体实施例中,测试一个服务端并发请求量的过程如下:
1、创建镜像,把客户端打包成镜像。
2、创建容器、分布式部署、启动客户端,其中部署启动容器需要多个参数(如图3所示):
镜像:就是客户端相关程序打包的镜像(如果没有太多依赖,这里也可以简单的打包一个空镜像,通过挂在目录到容器,直接启动客户端服务即可);
挂载目录:本机到容器的挂在目录,这里可以是用户服务的依赖,也可以是代码目录,根据需要来决定;
程序目录:这里就是客户端启动服务的目录;
启动命令:在上边配置的程序目录下,执行该命令,即启动你的客户端服务。这里启动命令支持中文传参;一个启动命令对应一个容器,即一个客户端。如配置了二十个启动命令,则启动二十个客户端的容器服务。
3、查看客户端容器:
创建容器后,可以通过查询页面查看每个机器客户端的情况。如图4所示,可以看到该镜像对应某台机器的客户端启动情况。这里可以单独关闭某个客户端进程,也可以单独关闭某台机器的所有客户端进程。
在本实施例中,可以看出都提供了创建、部署、查看、停止等功能。对于分布式配置以及单机客户端限制可以如下实施。
这里采用db的配置,当然可以传参或者采用配置文件。配置代码如下:
{
“_id”:ObjectId(“59239a48f5a5946a777ea1f5”),
“image”:”jazz-hello”
“host”:”10.20.102.228”
“limit”:”10”
}
{
“_id”:ObjectId(“59239a48f5a5946a777ea1f6”),
“image”:”jazz-hello”
“host”:”10.20.102.229”
“limit”:”10”
}
留意上面代码的加粗斜体部分。镜像jazz-hello配置了两台机器,每台机器的限制是最多启用10个客户单进程,即容器数量。当单台机器超过限制时,会自动选用另一台机器启动。比如配置了15个命令,那么IP 228机器会启用10个,超过限制的5个会在IP 229机器上启动,这样就做到了分布式和单机可配置。当然所有的参数都是可以调整的,完全在于你的配置。同时支持增量启动,如可以先启动八个客户端,然后再逐渐的增加客户端数量,直到达到要求为止。因此,不仅极大方便测试流程,针对部分项目的客户端压力测试,还可以做到客户端的随机并发,与一键管理,配置方便,操作简单。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接相合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在二个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在二个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM)、随机存取存储器(RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。