基于Netty的Rpc客户端在性能测试平台中的实现方法、系统、服务器及存储介质与流程

文档序号:17600846发布日期:2019-05-07 20:17阅读:338来源:国知局
基于Netty的Rpc客户端在性能测试平台中的实现方法、系统、服务器及存储介质与流程

本发明涉及性能压测及全链路压测领域,具体涉及一种基于netty的rpc客户端在性能测试平台中的实现方法、系统、服务器及存储介质。



背景技术:

基于socket的rpc通信协议开发的rpc客户端版本,但基于socket阻塞存在一些问题,如压测并发大导致tcp粘包,导致压测数据偶发错误使得压测失败,同时资源消耗大,针对斗鱼业务有些如弹幕类压测,socket的bio模型限定了一个弹幕发送必须等待对应的返回后才可以退出线程阻塞,导致线程消耗过大。



技术实现要素:

鉴于现有技术存在的问题,本发明的目的是提供一种基于netty的rpc客户端在性能测试平台中的实现方法、系统、服务器及存储介质,基于netty设计rpc协议客户端,通过固定长度编解码解决tpc网络的粘包;通过时间轮解决rpc客户端请求超时;通过future对象实现异步转同步;通过心跳事件进行保活,避免socket的定时发送心跳包,并通过异步机制提高资源利用率降低线程数进而节约施压资源。

为了实现上述目的,本发明采用的技术方案为一种基于netty的rpc客户端在性能测试平台中的实现方法,所述方法包括以下步骤:

s1、性能压测平台发送请求消息至rpc客户端,同时获取future对象;

s2、rpc客户端将获取的请求消息进行编码后,将编码后的请求消息发送至服务端;

s3、服务端接收编码后的请求消息并返回响应消息至rpc客户端,所述rpc客户端进行响应消息解码;

s4、rpc客户端将解码后的响应消息填充future对象,同时性能压测平台获取响应消息。

在上述技术方案中,所述步骤s2还包括以下步骤:

s21、所述rpc客户端接收请求消息后,通过心跳处理机制,由rpc客户端隔一段时间发送一个心跳包至服务端;

s22、所述rpc客户端将编码后的请求发送至服务端的同时rpc客户端开始计时,若编码后的请求消息超时无法发送,将返回rpc客户端通过时间轮超时处理;

s23、处理后的超时消息填充至future对象,同时性能压测平台获取超时信息。

在上述技术方案中,所述步骤s3中,若返回的响应消息发生tcp粘包,则通过固定长度解码器进行处理。

在上述技术方案中,所述步骤s22中,若rpc客户端接收到服务端返回的响应消息,则移除消息计时,释放内存占用。

在上述技术方案中,所述步骤s4中的future对象,等待服务端响应过程中,通过阻塞施压线程等待响应或超时消息。

本发明还公开一种基于netty的rpc客户端在性能测试平台中的实现系统,所述系统包括请求模块、编码模块、解码模块以及获取模块;

请求模块,用于当性能压测平台发送请求消息至rpc客户端,同时获取future对象;

编码模块,用于在rpc客户端将获取的请求消息进行编码后,将编码后的请求消息发送至服务端;

解码模块,用于在服务端接收编码后的请求消息并返回响应消息至rpc客户端,所述rpc客户端进行响应消息解码;

获取模块,用于当rpc客户端将解码后的响应消息填充future对象,同时性能压测平台获取响应消息。

在上述技术方案中,所述编码模块包括:

保活模块,用于当所述rpc客户端接收请求消息后,通过心跳处理机制,由rpc客户端隔一段时间发送一个心跳包至服务端;

时间轮模块,所述rpc客户端将编码后的请求发送至服务端的同时rpc客户端开始计时,若编码后的请求消息超时无法发送,将返回rpc客户端通过时间轮超时处理;

超时写入模块,用于将处理后的超时消息填充至future对象,同时性能压测平台获取超时信息。

在上述技术方案中,所述解码模块包括:

粘包处理模块,用于当返回的响应消息发生tcp粘包,则通过固定长度解码器进行处理;

移除计时模块,用于当rpc客户端接收到服务端返回的响应消息时,则移除消息计时,释放内存占用。

本发明还公开一种基于netty的rpc客户端在性能测试平台中的实现系统的服务器,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任一项所述一种基于netty的rpc客户端在性能测试平台中的实现方法的步骤。

本发明还公开一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述一种基于netty的rpc客户端在性能测试平台中的实现方法的步骤。

本发明一种基于netty的rpc客户端在性能测试平台中的实现方法、系统、服务器及存储介质,具有以下有益效果:通过固定长度编解码解决tpc网络的粘包;通过时间轮解决rpc客户端请求超时;通过future对象实现异步转同步;通过心跳事件进行保活,避免socket的定时发送心跳包,并通过异步机制提高资源利用率降低线程数进而节约施压资源。

附图说明

图1为本发明实施例一提供的一种基于netty的rpc客户端在性能测试平台中的实现方法的流程图;

图2本发明实施例二提供一种基于netty的rpc客户端在性能测试平台中的实现系统模块图;

图3为本发明实施例三提供的服务器的结构示意图。

具体实施方式

本发明提供一种基于netty的rpc客户端在性能测试平台中的实现方法、系统、服务器及存储介质,通过性能压测平台发送的请求消息至rpc客户端,通过客户端进行消息编码再发送至服务端,服务端返回响应消息至客户端解码后返回性能压测平台。

为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

本发明如图1所示实施例一提供基于netty的rpc客户端在性能测试平台中的实现方法,所述方法包括以下步骤:

s1、性能压测平台发送请求消息至rpc客户端,同时获取future对象;

其中,性能测试平台的核心功能是产生压力,也就是模拟成千上万的人,对另一个系统进行压力测试。那么要模拟大量用户的行为,就要对用户行为进行预定义,也就是要开发测试脚本。脚本开发者,模拟一个用户行为后,马上就可以获取一个future对象,future是rpc客户端和脚本开发者共同持有,当rpc客户端完成某个行为后,会去更改这个future的状态。那么脚本开发者就可以通过不停轮询或阻塞(同步)的方式,等待future状态变更。即是性能压测平台每发送一个请求会立即获得一个future对象,所述future对象提供future返回,rpc客户端在future中进行对应返回业务的处理,该模式尤其适合弹幕消息类发送,需要很少的施压机资源即可产生大量的消息。

其中,所述rpc(remoteprocedurecallprotocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议。客户端在不必知道调用细节的前提之下,调用远程计算机上运行的某个对象,使用起来就像调用本地的对象一样。目前典型的rpc实现框架有:thrift(facebook开源)、dubbo(alibaba开源)等等。rpc框架针对网络协议、网络i/o模型的封装是透明的,对于调用的客户端而言,它就认为自己在调用本地的一个对象。至于传输层上,运用的是tcp协议、udp协议、亦或是http协议,一概不关心。从网络i/o模型上来看,是基于select、poll、epoll方式、还是iocp(i/ocompletionport)方式承载实现的。

具体的,1.定义rpc请求消息、应答消息结构,里面要包括rpc的接口定义模块、包括远程调用的类名、方法名称、参数结构、参数值等信息。2、服务端初始化的时候通过容器加载rpc接口定义和rpc接口实现类对象的映射关系,然后等待客户端发起调用请求。3、客户端发起的rpc消息里面包含,远程调用的类名、方法名称、参数结构、参数值等信息,通过网络,以字节流的方式送给rpc服务端,rpc服务端接收到字节流的请求之后,去对应的容器里面,查找客户端接口映射的具体实现对象。4、rpc服务端找到实现对象的参数信息,通过反射机制创建该对象的实例,并返回调用处理结果,最后封装成rpc应答消息通知到客户端。5、客户端通过网络,收到字节流形式的rpc应答消息,进行拆包、解析之后,显示远程调用结果。

实现的过程中会出现如下问题:1、rpc服务器的传输层是基于tcp协议的,会出现粘包,这样客户端的请求,服务端是否会解析失败,而netty里面已经提供了解决tcp粘包问题的解码器:lengthfieldbasedframedecoder,可以靠它轻松搞定tcp粘包问题。2、netty服务端的线程模型是单线程、多线程(一个线程负责客户端连接,连接成功之后,丢给后端io的线程池处理)、还是主从模式(客户端连接、后端io处理都是基于线程池的实现)。若出于性能考虑,使用了netty主从线程池模型。3、rpc服务器要考虑多线程、高并发的使用场景,所以线程安全是必须的。此外尽量不要使用synchronized进行加锁,改用轻量级的reentrantlock方式进行代码块的条件加锁。6、rpc服务端的服务接口对象和服务接口实现对象要能轻易的配置,轻松进行加载、卸载。

s2、rpc客户端将获取的请求消息进行编码后,将编码后的请求消息发送至服务端;

其中,所述步骤s2还包括以下步骤:

s21、所述rpc客户端接收请求消息后,通过心跳处理机制,由rpc客户端隔一段时间发送一个心跳包至服务端,用于保证rpc客户端与服务端的长连接。所述rpc客户端采用格式转换和字符替换方式进行编码。

其中,心跳处理机制是这样处理的:服务端会启动一个特定的线程处理所有合法登陆的用户对象,并且指定时间内扫描客户端对象(向每一个客户端发送心跳包,客户端收到之后需要回复一个心跳),如果在指定时间内客户端没有返回任何数据,服务端会认为该客户端已经死掉了,然后踢掉它。

通过空闲处理器,用于连接保活,即通过心跳时间处理逻辑,在空闲时刻发送心跳保活包,保活rpc客户端与服务端的长连接,放置长时间无操作服务端关闭连接。所述处理器的参数为ch.pipeline().addlast(newidlestatehandler(0,5,5)),其中,readeridletime为读超时时间(即测试端一定时间内未接受到被测试端消息),writeridletime为写超时时间(即测试端一定时间内向被测试端发送消息),allidletime:所有类型的超时时间。

s22、所述rpc客户端将编码后的请求发送至服务端的同时rpc客户端开始计时,若编码后的请求消息超时无法发送,将返回rpc客户端通过时间轮超时处理;

所述时间轮是一个固定大小的数组结构,这个数组的每一个槽(元素)代表着软定时器的精度,(类似于时钟的最小刻度),时间轮的优点是通过排序的时间列表来有效的更新timers.它能非常效率地安装(instaallation),取消(cancellation)timer。

所述rpc客户端针对rpc响应的超时,设计了一种时间轮模型,作为一种客户端内超时器的通用存储;时间轮模型将时间转盘上分成一定的小刻度,旨在解决在周期性超时时间(如:每30秒一个周期)在周期时间节点到来之前(如:周期前29秒)一直处理无谓的等待,且当前这个周期内聚集大量记录时,还会造成数据堆积和处理排队问题。使用时间轮,将待处理的数据分散到转盘的每个小刻度的时间槽内,时间轮每转动一次,只要时间槽内有数据就处理,不会出现无谓的等待时间,也极大提升数据处理及时性。每个小刻度上挂在对应的超时任务,时间轮每个小刻度轮转一次,找到对应刻度上的超时任务列表,进而触发超时任务的处理。

定义中integer是对应时间轮的刻度,后面value是并发安全的超时任务处理列表。

privatemap<integer,

concurrentlinkedqueue<entry<channelpromise,sampleresult>>>timewheelbuf;

其中,concurrentlinkedqueue是基于链接节点的无界线程安全队列。此队列按照fifo(先进先出)原则对元素进行排序。队列的头部是队列中时间最长的元素。队列的尾部是队列中时间最短的元素。timewheelbuf是一个时间轮盘(映射一片内存区域)。

定义时间轮指针,标记当期时间轮位置

privatevolatileatomicintegernextticks;//下一时刻指针,轮盘的100ms指针。

当时间轮触发某一位置的超时处理时,通过刻度获取对应超时任务列表。

concurrentlinkedqueue<entry<channelpromise,sampleresult>>timeslot=timewheelbuf.get(nextticks.get());

其中,timeslot是时间轮盘上的一个时间槽,它把时间轮盘对应的一大片内存区域划分成一块一块小的逻辑区域,每一个逻辑区域对应的就是一个时间刻度,所以这里表示的是从时间轮盘中去取出下一个刻度对应的时间槽(也就是时间轮盘对应的一片内存区域中的一块小的逻辑内存区域)。

s23、处理后的超时消息填充至future对象,同时性能压测平台获取超时信息。

s3、服务端接收编码后的请求消息并返回响应消息至rpc客户端,所述rpc客户端进行响应消息解码;

所述步骤s3中,若返回的响应消息发生tcp粘包,则通过固定长度解码器进行处理。

通过stt编解码将json数据转换为stt协议编码,再通过byte编解码将stt协议编码为对应二进制数据。通过定长编解码器即length-body模式解决tcp分片时带来的粘包问题。将编解码通过pipeline责任链模式串联起来隔离编解码的同时提高编解码后续扩展性。

ch.pipeline().addlast("framedecoder",new

lengthfieldbasedframedecoder(byteorder.little_endian,65535,0,4,0,4,true));

/*入站处理器:rpc协议解码器:将网络二进制流转成rpc响应对象*/

ch.pipeline().addlast("bytedecoder",newrpcresponsebytedecoder());

/*入站处理器:rpc协议的数据区stt解码器:将rpc响应对象的数据区stt文本对象转成json数据对象*/

ch.pipeline().addlast("sttdecoder",newrpcresponsesttdecoder());

/*出站处理器:包长处理器

*编码:发包前,在包头封装4个字的包长信息

**/

ch.pipeline().addlast("frameencoder",new

lengthfieldprepender(byteorder.little_endian,4,0,false));

lengthfieldprepender(byteorder.little_endian,4,0,false));

/*出站处理器:二进制流编码器:将rpc请求对象转成网络二进制流*/

ch.pipeline().addlast("byteencoder",newrpcrequestbyteencoder());

/*出站处理器:stt编码器():将rpc请求对象的数据区k,v数据对象转成stt文本对象*/

ch.pipeline().addlast("sttencoder",newrpcrequeststtencoder());

s4、rpc客户端将解码后的响应消息填充future对象,同时性能压测平台获取响应消息。

其中,所述步骤s22中,若rpc客户端接收到服务端返回的响应消息,则移除消息计时,释放内存占用并降低时间轮的时间槽内元素个数。其中,rpc客户端发送消息至服务端后,rpc客户端会把这条消息的唯一标识放入时间轮的时间槽内并开始计时,服务端响应消息并返回至rpc客户端后,将此消息的唯一标识从时间槽内清除掉。

其中,所述步骤s4中的future对象,等待服务端响应过程中,通过阻塞施压线程等待响应或超时消息。

其中,所述future具有局限性。在实际应用中,当需要下载大量图片或视频时,可以使用多线程去下载,提交任务下载后,可以从多个future中获取下载结果,由于future获取任务结果是阻塞的,所以将会依次调用future.get()方法,这样的效率会很低。很可能第一个下载速度很慢,则会拖累整个下载速度。future主要功能在于获取任务执行结果和对异步任务的控制。但如果要获取批量任务的执行结果,单使用future是很不方便的。其主要原因在于:一方面是没有好的方法去判断第一个完成的任务;另一方面是future的get方法是阻塞的,使用不当会造成线程的浪费。第一个问题可以用completionservice解决,所述completionservice提供了可以操作异步任务的功能,completionservice的实现是维护一个保存future对象的blockingqueue。只有当这个future对象状态是结束的时候,才会加入到这个queue中,take()方法其实就是producer-consumer中的consumer。它会从queue中取出future对象,如果queue是空的,就会阻塞在那里,直到有完成的future对象加入到queue中,completionservice提供了一个take()阻塞方法,用以依次获取所有已完成的任务。第二个问题可以用googleguava库所提供的listeningexecutorservice和listenablefuture来解决。其中,所述listenablefuture允许注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用。所述listenablefuture是可以监听的future,它是对future的扩展增强,使用listenablefuture检测future是否完成。除了获取批量任务执行结果时不便,future另外一个不能做的事便是防止任务的重复提交。要做到这件事就需要future最常见的一个实现类futuretask了。future只实现了异步,而没有实现回调,主线程get时会阻塞,可以轮询以便获取异步调用是否完成。

可选的,所述性能测试平台定义为thor平台,thor平台每发送一个请求同时获得一个future对象,future对象封装为thorfuture,客户端获取thor平台的请求消息后,所述thorfuture阻塞施压线程,阻塞退出的逻辑是根据thor平台获取rpc客户端返回的响应信息或者响应超时信息进行决定。具体程序如下:

本发明如图2所示实施例二还公开一种基于netty的rpc客户端在性能测试平台中的实现系统,所述系统包括请求模块、编码模块、解码模块以及获取模块;

请求模块,用于当性能压测平台发送请求消息至rpc客户端,同时获取future对象;

编码模块,用于在rpc客户端将获取的请求消息进行编码后,将编码后的请求消息发送至服务端;

解码模块,用于在服务端接收编码后的请求消息并返回响应消息至rpc客户端,所述rpc客户端进行响应消息解码;

获取模块,用于当rpc客户端将解码后的响应消息填充future对象,同时性能压测平台获取响应消息。

其中,所述编码模块包括:

保活模块,用于当所述rpc客户端接收请求消息后,通过心跳处理机制,由rpc客户端隔一段时间发送一个心跳包至服务端,用于保证rpc客户端与服务端的长连接。

时间轮模块,所述rpc客户端将编码后的请求发送至服务端的同时rpc客户端开始计时,若编码后的请求消息超时无法发送,将返回rpc客户端通过时间轮超时处理;

超时写入模块,用于将处理后的超时消息填充至future对象,同时性能压测平台获取超时信息。

其中,所述解码模块包括:

粘包处理模块,用于当返回的响应消息发生tcp粘包,则通过固定长度解码器进行处理;

移除计时模块,用于当rpc客户端接收到服务端返回的响应消息时,则移除消息计时,释放内存占用。

本发明实施例三如图3所示提供一种基于netty的rpc客户端在性能测试平台中的实现系统的服务器结构示意图,所述实施例的服务器包括:处理器30、存储器31以及存储在所述存储器31中并可在所述处理器30上运行的计算机程序32。所述处理器30执行所述计算机程序32时实现上述各方法实施例中的步骤,所述处理器30执行所述计算机程序32时实现上述装置实施例中各模块的功能。

所述一种提高客户端运行稳定性的系统的服务器可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备,所述一种基于netty的rpc客户端在性能测试平台中的实现系统的服务器可包括,但不限于,处理器30、存储器31。图3仅仅是对此服务器的示例,并不构成对此服务器的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,所述一种基于netty的rpc客户端在性能测试平台中的实现系统的服务器还可以包括输入输出设备33、显示设备34等。

所述处理器30可以是中央处理单元,还可以是其他通用处理器、数字信号处理器、专用集成电路、现成可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

所述存储器31可以是所述一种基于netty的rpc客户端在性能测试平台中的实现系统的服务器的内部存储单元、硬盘或内存。所述存储器31也可以是所述服务器的外部存储设备,或配备的插接式硬盘,智能存储卡,安全数字卡,闪存卡等。

进一步地,所述存储器31还可以既包括所述服务器的内部存储单元也包括外部存储设备。所述存储器31用于存储所述计算机程序以及所述电子设备所需的其他程序和数据。所述存储器31还可以用于暂时地存储已经输出或者将要输出的数据。

所述的输入输出设备33可用于接收输入的数字或字符信息,具体的,输入输出设备33还可以包括但不限于键盘、鼠标、操作杆等中的一种和多种。

所述的显示设备34可用于显示由用户输入的信息或提供给用户信息以及终端的各种菜单,显示设备34可包括显示面板,可选的,可采用液晶显示器。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各实施例的模块、方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1