一种基于Netty的性能测试平台的通信方法及性能测试平台
技术领域
本发明涉及性能测试领域,尤其涉及一种基于Netty的性能测试平台的通信方法及性能测试平台。
背景技术
随着计算机领域的快速发展,工程师们针对人们的需求开发了许多程序,为了确保程序的可行性,需要进行性能检测。
现有技术中,基于开源压测平台nGrinder进行测试,nGrinder压测结构由控制台(console)管理施压机(agent),施压机集群创建具体的施压进程和线程对目标服务器进行压测,主要涉及console端和agent端之间的通信。
nGrinder通过socket实现cosole和agent之间的通信,因为基于socket的通信是开环的,对于一些需要等待确认的同步消息场景和只发消息不需确认的场景不能同时支持。当网络消息拥堵时,可能发生消息错乱现象,系统的稳定性差。
发明内容
本发明实施例提供了一种基于Netty的性能测试平台的通信方法及性能测试平台,用于提高测试系统在不同场景下的稳定性,提高了工作效率。
本发明实施例的第一方面提供了一种基于Netty的性能测试平台的通信方法,包括:获取网络消息;通过Netty的定长编解码器对所述网络消息进行解码,得到第一消息,所述Netty的定长编解码器用于从所述网络消息中获取完整的数据包;通过Jdk序列化解码器对所述第一消息进行解码,得到第二消息,所述Jdk序列化解码器用于将所述第一消息的格式转换为网络字节;通过异步转同步层将所述第二消息进行同步,得到同步消息;通过所述同步消息进行性能测试。
在一种可能的实施例中,所述通过Netty的定长编解码器对所述网络消息进行解码,得到第一消息,所述Netty的定长编解码器用于从所述网络消息中获取完整的数据包,包括:调用Netty的定长编解码器,所述定长编解码器包括LengthFieldPrepender编码器和LengthFieldBasedFrameDecoder解码器,其中,所述LengthFieldPrepender编码器最大长度为64K,所述LengthFieldBasedFrameDecoder解码器的帧长度字段为4字节;对所述网络消息进行解码,得到第一消息,所述第一消息由完整的数据包构成。
在一种可能的实施例中,所述通过Jdk序列化解码器对所述第一消息进行解码,得到第二消息,所述Jdk序列化解码器用于将所述第一消息的格式转换为网络字节,包括:将所述第一消息和网络字节进行映射;调用Jdk的ObjectOutputStream函数将所述第一消息转换为第二消息,所述第二消息的格式为网络字节。
在一种可能的实施例中,所述通过异步转同步层将所述第二消息进行同步,得到同步消息,包括:调用ResponseFuture类对所述第二消息进行编号;将编号和所述第二消息的映射关系存储在所述ResponseFuture类的静态Map缓存中;调用ExchangeHandler函数对所述第二消息的消息类型进行识别;当所述消息类型为AbstractExchangeMessage时,提取所述第二消息中的requestId字段,并清除ResopnseFuture的阻塞状态。
在一种可能的实施例中,所述通过异步转同步层将所述第二消息进行同步,得到同步消息之后,所述通过所述同步消息进行性能测试之前,所述方法还包括:通过消息分发器的MessageDispatch类将同步消息从业务handler类中剥离;通过所述MessageDispatch类完成对所述同步消息的存储;对所述同步消息进行注册;将注册后的同步消息进行分发。
在一种可能的实施例中,所述通过所述同步消息进行性能测试包括:创建施压进程;通过所述施压进程对所述同步消息进行性能测试。
在一种可能的实施例中,所述通过所述施压进程对所述同步消息进行性能测试之后,所述方法还包括:终止所述施压进程。
本发明实施例的第二方面提供了一种性能测试平台,包括:获取单元,用于获取网络消息;第一解码单元,用于通过Netty的定长编解码器对所述网络消息进行解码,得到第一消息,所述Netty的定长编解码器用于从所述网络消息中获取完整的数据包;第二解码单元,用于通过Jdk序列化解码器对所述第一消息进行解码,得到第二消息,所述Jdk序列化解码器用于将所述第一消息的格式转换为网络字节;同步单元,用于通过异步转同步层将所述第二消息进行同步,得到同步消息;测试单元,用于通过所述同步消息进行性能测试。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述第一方面任意一项所述的基于Netty的性能测试平台的通信方法的步骤。
本申请的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述各方面所述的方法。
本申请的第五方面提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述各方面所述的方法。
附图说明
图1为本发明实施例提供的一种基于Netty的性能测试平台的通信方法的流程图;
图2为本发明实施例提供的一种性能测试平台的结构示意图;
图3为本发明实施例提供的一种可能的电子设备的硬件结构示意图;
图4为本发明实施例提供的一种可能的计算机可读存储介质的硬件结构示意图。
具体实施方式
本发明实施例提供了一种基于Netty的性能测试平台的通信方法及性能测试平台,用于提高测试系统在不同场景下的稳定性,提高了工作效率。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
Netty是新输入输出(New IO,NIO)框架,网络消息是异步的发送过程,通过Netty的ChannelFuture只能是确定消息发送的时候做些确认操作,无法接收消息接收端发送的确认消息;而性能测试平台NGrinder有些消息需要等待返回确认消息,此确认消息是接收端发出。
请参阅图1,为本发明实施例提供的基于Netty的性能测试平台的通信方法的流程图,具体包括:
101、获取网络消息。
本发明可以是服务器或终端获取网络消息。为了便于理解,本发明实施例以服务器为接收端进行说明。服务器获取网络消息。
102、通过Netty的定长编解码器对网络消息进行解码,得到第一消息,Netty的定长编解码器用于从网络消息中获取完整的数据包。
生产Netty的定长编解码器,其中,该Netty的定长编解码器由原生的LengthFieldPrepender编码器和LengthFieldBasedFrameDecoder解码器封装得到;该Netty的定长编解码器用于从所述网络消息中获取完整的数据包。
需要说明的是,其中,所述LengthFieldPrepender编码器最大长度为64K,所述LengthFieldBasedFrameDecoder解码器的帧长度字段为4字节。
103、通过Jdk序列化解码器对第一消息进行解码,得到第二消息,Jdk序列化解码器用于将第一消息的格式转换为网络字节。
将Java格式的消息对象(即第一消息)和网络字节做一个映射,采用Jdk的ObjectOutputStream类进行序列化将Java格式的消息对象转换为网络字节。需要说明的是,当需要进行编码时,调用ObjectInputStream类进行反序列化,将网络字节转为Java格式的消息对象。
序列化解码过程的具体实现如下:
反序列化编码过程的具体实现如下:
104、通过异步转同步层将第二消息进行同步,得到同步消息。
本发明将同步的消息都生成一个编号,并将编号和对应的消息进行缓存,消息发送端发送消息后即阻塞,当发送消息超时或到接收到该消息编号的确认消息为止,清除阻塞状态,即完成消息的异步转同步过程。
需要说明的是,若将异步转同步固化到消息接收pipeline链路中,后续性能测试平台的其他通道可以复用,不需要考虑异步转同步过程。
本发明异步转同步通过ResponseFuture类和ExchangeHandler实现。其中,ResponseFuture类中有唯一编号生成器:private static final AtomicLongidGenerator=new AtomicLong(1);编号和对应的消息的映射关系存储在ResponseFuture类的静态Map缓存中,如:
private static final ConcurrentHashMap<Long,ResponseFuture>map=newConcurrentHashMap<Long,ResponseFuture>();
当消息发送时,设置消息的唯一requestId字段,本发明的消息分为两类,一类消息的直接父类是Message,同步消息的直接父类是AbstractExchangeMessage;其中,AbstractExchangeMessage继承Message,并扩展一个requestId字段。
异步消息的发送过程如下:
同步消息发送过程如下:
同步发送消息后,需要通过get阻塞直到收到确认消息或超过millsTimeOut时间为止。ExchangeHandler类在接收到消息时,需要对接收的消息进行识别,当消息类型是AbstractExchangeMessage时,提取消息中的requestId,,清除resopnseFuture的阻塞状态,具体过程如下:
105、通过同步消息进行性能测试。
服务器通过同步消息进行性能测试。可以理解的是,本实施例的通信是在客户端(client)和服务器(server)之间进行,在client和server建立通道连接时,后续消息的收发没有严格必须是client主动发消息,server被动接受消息发送返回,因此本发明将client和server都实现消息的主动发送功能。
Client端的消息发送直接根据client发送消息即可,client的实例化对象已经从属于一个任务,不需要传入任务id,同步发送消息和异步发送消息如上;
Server端属于施压机Agent,,一个Agent上可能含有多个任务的通道,因此Server端发送消息需要识别任务。本实施例的Server端会缓存任务id和管道的对应关系,根据任务id找到对应管道即可完成Server端的消息发送。
本发明实施例,通过定长编解码器解决传输控制协议(transmission controlprotocol,TCP)流式通信的粘包问题,并且通过Jdk序列化和反序列化解决Java对象到字节流的映射,提高测试系统在不同场景下的稳定性,提高了工作效率。
可选的,在上述图1对应的实施例的基础上,本发明实施例提供的基于Netty的性能测试平台的通信方法的可选实施例中,所述通过Netty的定长编解码器对所述网络消息进行解码,得到第一消息,所述Netty的定长编解码器用于从所述网络消息中获取完整的数据包,包括:调用Netty的定长编解码器,所述定长编解码器包括LengthFieldPrepender编码器和LengthFieldBasedFrameDecoder解码器,其中,所述LengthFieldPrepender编码器最大长度为64K,所述LengthFieldBasedFrameDecoder解码器的帧长度字段为4字节;对所述网络消息进行解码,得到第一消息,所述第一消息由完整的数据包构成。本发明实施例,通过生成的定长编解码器解决TCP流式通信的粘包问题。
可选的,在上述图1对应的实施例的基础上,本发明实施例提供的基于Netty的性能测试平台的通信方法的可选实施例中,所述通过Jdk序列化解码器对所述第一消息进行解码,得到第二消息,所述Jdk序列化解码器用于将所述第一消息的格式转换为网络字节,包括:将所述第一消息和网络字节进行映射;调用Jdk的ObjectOutputStream函数将所述第一消息转换为第二消息,所述第二消息的格式为网络字节。本发明实施例,通过Jdk序列化和反序列化解决Java对象到字节流的映射问题。
可选的,在上述图1对应的实施例的基础上,本发明实施例提供的基于Netty的性能测试平台的通信方法的可选实施例中,所述通过异步转同步层将所述第二消息进行同步,得到同步消息,包括:调用ResponseFuture类对所述第二消息进行编号;将编号和所述第二消息的映射关系存储在所述ResponseFuture类的静态Map缓存中;调用ExchangeHandler函数对所述第二消息的消息类型进行识别;当所述消息类型为AbstractExchangeMessage时,提取所述第二消息中的requestId字段,并清除ResopnseFuture的阻塞状态。本发明实施例,通过生成异步转同步层,解决了Netty的异步NIO框架造成的异步转同步问题。
可选的,在上述图1对应的实施例的基础上,本发明实施例提供的基于Netty的性能测试平台的通信方法的可选实施例中,所述通过异步转同步层将所述第二消息进行同步,得到同步消息之后,所述通过所述同步消息进行性能测试之前,所述方法还包括:通过消息分发器的MessageDispatch类将同步消息从业务handler类中剥离;通过所述MessageDispatch类完成对所述同步消息的存储;对所述同步消息进行注册;将注册后的同步消息进行分发。本发明实施例,通过消息分发器组件,将框架的可变部分和固定部分分离,使得后续维护性能测试平台框架会变的非常简单,提高了测试系统的扩展性。
可选的,在上述图1对应的实施例的基础上,本发明实施例提供的基于Netty的性能测试平台的通信方法的可选实施例中,所述通过所述同步消息进行性能测试包括:创建施压进程;通过所述施压进程对所述同步消息进行性能测试。
可选的,在上述图1对应的实施例的基础上,本发明实施例提供的基于Netty的性能测试平台的通信方法的可选实施例中,所述通过所述施压进程对所述同步消息进行性能测试之后,所述方法还包括:终止所述施压进程。
上面从基于Netty的性能测试平台的通信方法的角度对本发明实施例进行了描述,下面从基于Netty的性能测试装置的角度对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的性能测试平台的实施例示意图,包括:
获取单元201,用于获取网络消息;
第一解码单元202,用于通过Netty的定长编解码器对所述网络消息进行解码,得到第一消息,所述Netty的定长编解码器用于从所述网络消息中获取完整的数据包;
第二解码单元203,用于通过Jdk序列化解码器对所述第一消息进行解码,得到第二消息,所述Jdk序列化解码器用于将所述第一消息的格式转换为网络字节;
同步单元204,用于通过异步转同步层将所述第二消息进行同步,得到同步消息;
测试单元205,用于通过所述同步消息进行性能测试。
可选的,在一些可能的实现方式中,第一解码单元202具体用于:
调用Netty的定长编解码器,所述定长编解码器包括LengthFieldPrepender编码器和LengthFieldBasedFrameDecoder解码器,其中,所述LengthFieldPrepender编码器最大长度为64K,所述LengthFieldBasedFrameDecoder解码器的帧长度字段为4字节;对所述网络消息进行解码,得到第一消息,所述第一消息由完整的数据包构成。
可选的,在一些可能的实现方式中,第二解码单元203具体用于:
将所述第一消息和网络字节进行映射;
调用Jdk的ObjectOutputStream函数将所述第一消息转换为第二消息,所述第二消息的格式为网络字节。
可选的,在一些可能的实现方式中,同步单元204具体用于:
调用ResponseFuture类对所述第二消息进行编号;
将编号和所述第二消息的映射关系存储在所述ResponseFuture类的静态Map缓存中;
调用ExchangeHandler函数对所述第二消息的消息类型进行识别;
当所述消息类型为AbstractExchangeMessage时,提取所述第二消息中的requestId字段,并清除ResopnseFuture的阻塞状态。
可选的,在一些可能的实现方式中,基于Netty的性能测试装置还包括:
剥离单元206,用于通过消息分发器的MessageDispatch类将同步消息从业务handler类中剥离;
存储单元207,用于通过所述MessageDispatch类完成对所述同步消息的存储;
注册单元208,用于对所述同步消息进行注册;
分发单元209,用于将注册后的同步消息进行分发。
可选的,在一些可能的实现方式中,测试单元205具体用于:
创建施压进程;
通过所述施压进程对所述同步消息进行性能测试。
可选的,在一些可能的实现方式中,基于Netty的性能测试装置还包括:
终止单元,用于终止所述施压进程。
请参阅图3,图3为本发明实施例提供的电子设备的实施例示意图。
如图3所示,本发明实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:获取网络消息;通过Netty的定长编解码器对所述网络消息进行解码,得到第一消息,所述Netty的定长编解码器用于从所述网络消息中获取完整的数据包;通过Jdk序列化解码器对所述第一消息进行解码,得到第二消息,所述Jdk序列化解码器用于将所述第一消息的格式转换为网络字节;通过异步转同步层将所述第二消息进行同步,得到同步消息;通过所述同步消息进行性能测试。
可选的,在一种可能的实施例中,所述处理器具体用于:调用Netty的定长编解码器,所述定长编解码器包括LengthFieldPrepender编码器和LengthFieldBasedFrameDecoder解码器,其中,所述LengthFieldPrepender编码器最大长度为64K,所述LengthFieldBasedFrameDecoder解码器的帧长度字段为4字节;对所述网络消息进行解码,得到第一消息,所述第一消息由完整的数据包构成。
可选的,在一种可能的实施例中,所述处理器具体用于:将所述第一消息和网络字节进行映射;调用Jdk的ObjectOutputStream函数将所述第一消息转换为第二消息,所述第二消息的格式为网络字节。
可选的,在一种可能的实施例中,所述处理器具体用于:调用ResponseFuture类对所述第二消息进行编号;将编号和所述第二消息的映射关系存储在所述ResponseFuture类的静态Map缓存中;调用ExchangeHandler函数对所述第二消息的消息类型进行识别;当所述消息类型为AbstractExchangeMessage时,提取所述第二消息中的requestId字段,并清除ResopnseFuture的阻塞状态。
可选的,在一种可能的实施例中,所述处理器具体用于:通过消息分发器的MessageDispatch类将同步消息从业务handler类中剥离;通过所述MessageDispatch类完成对所述同步消息的存储;对所述同步消息进行注册;将注册后的同步消息进行分发。
可选的,在一种可能的实施例中,所述处理器具体用于:创建施压进程;通过所述施压进程对所述同步消息进行性能测试。
可选的,在一种可能的实施例中,所述处理器具体用于:终止所述施压进程。
在具体实施过程中,处理器320执行计算机程序311时,可以实现图1对应的实施例中任一实施方式。
本发明实施例,通过定长编解码器解决TCP流式通信的粘包问题,并且通过Jdk序列化和反序列化解决Java对象到字节流的映射,提高测试系统在不同场景下的稳定性,提高了工作效率。
请参阅图4,图4为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:获取网络消息;通过Netty的定长编解码器对所述网络消息进行解码,得到第一消息,所述Netty的定长编解码器用于从所述网络消息中获取完整的数据包;通过Jdk序列化解码器对所述第一消息进行解码,得到第二消息,所述Jdk序列化解码器用于将所述第一消息的格式转换为网络字节;通过异步转同步层将所述第二消息进行同步,得到同步消息;通过所述同步消息进行性能测试。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:调用Netty的定长编解码器,所述定长编解码器包括LengthFieldPrepender编码器和LengthFieldBasedFrameDecoder解码器,其中,所述LengthFieldPrepender编码器最大长度为64K,所述LengthFieldBasedFrameDecoder解码器的帧长度字段为4字节;对所述网络消息进行解码,得到第一消息,所述第一消息由完整的数据包构成。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:将所述第一消息和网络字节进行映射;调用Jdk的ObjectOutputStream函数将所述第一消息转换为第二消息,所述第二消息的格式为网络字节。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:调用ResponseFuture类对所述第二消息进行编号;将编号和所述第二消息的映射关系存储在所述ResponseFuture类的静态Map缓存中;调用ExchangeHandler函数对所述第二消息的消息类型进行识别;当所述消息类型为AbstractExchangeMessage时,提取所述第二消息中的requestId字段,并清除ResopnseFuture的阻塞状态。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过消息分发器的MessageDispatch类将同步消息从业务handler类中剥离;通过所述MessageDispatch类完成对所述同步消息的存储;对所述同步消息进行注册;将注册后的同步消息进行分发。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:创建施压进程;通过所述施压进程对所述同步消息进行性能测试。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:终止所述施压进程。
本发明实施例,通过定长编解码器解决TCP流式通信的粘包问题,并且通过Jdk序列化和反序列化解决Java对象到字节流的映射,提高测试系统在不同场景下的稳定性,提高了工作效率。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。