一种基于UDP通信的远程过程调用方法
2020-05-07
1 引言
远程过程调用(Remote Procedure Call,RPC)是一种通过网络从远程计算机程序上请求服务。通过RPC,使用者无需了解底层网络技术,快速开发部署业务功能逻辑[1]。因此,在RPC在分布式系统中的系统环境建设和应用程序设计中有着广泛的应用[2],如:分布式操作系统的进程间通讯、构造分布式计算的软件环境、远程数据库服务、分布式应用程序设计、分布式程序的调试等。
RPC主流实现的方式[3]有:基于TCP协议、基于HTTP协议。基于TCP协议实现RPC,由于处于协议栈底层,可更灵活地对协议字段进行定制,减少网络传输字节数,提高性能,但受所定义协议的局限,需要关注底层实现细节,难以实现跨平台调用,不同的终端需要开发不同的工具包来进行请求发送和响应解析,代码量高,工作量大[4];基于HTTP协议实现RPC,作为通用的格式标准,使用JSON和XML格式开发相对成熟,但与TCP传输性能的存在较大差距[5]。
综上所述,基于上述协议的主流RPC框架,虽然有适用面广、功能强大的优点,但是也存在着代码量多、流程复杂、对系统开销较大的缺点,用于小型应用程序上过于庞大,因此,本文提出一种基于UDP通信的远程过程调用方法,采用对系统开销较小的UDP协议,利用负载均衡策略,基于服务进程向注册进程注册服务的方式,应用进程从注册进程获取服务进程的相关信息,实现应用与服务进程的直接RPC通信,具备构架轻便、系统开销小的特点,满足小型应用程序的轻量化要求,具有重要的意义。
2 基于UDP通信的远程调用方法
RPC系统采用C/S模式,请求程序作为客户机,服务提供程序作为服务器,由请求程序向服务程序发送调用信息,能够获得答复信息并获得进程结果,交互流程如图1所示。
图1 RPC交互流程
基于UDP通信的远程调用方法,包含以下重要部分:①服务端服务进程注册模块、②客户端查询注册进程模块、③应用进程负载均衡策略、④客户端发送RPC服务请求模块、⑤服务端执行对应的业务流程模块、⑥服务端发送响应信息模块、⑦客户端接收响应信息模块,各部分对应的步骤如图2所示。
图2 基于UDP通信的远程调用方法
系统处理流程如下:①首先,客户进程中,应用层调用RPC接口的API发起请求,调用系统网络接口发送请求,通过网络数据包从客户端发到服务端;②然后,服务进程中,RPC请求从服务端的系统层传递到用户层的RPC接口,通过RPC请求解析后,找到对应的服务层,并将执行结果发回给RPC接口,调用系统网络接口回复执行结果;③最后,客户进程中,执行结果通过网络数据包从服务端发到客户端,从客户端的系统层传递到用户层的RPC接口,将执行结果转给对应的应用层,完成请求任务。
各部分详细介绍如下。
2.1 服务端服务进程注册模块
服务进程是提供RPC服务的应用程序,需要注册在服务器上,其对应信息包含:RPC服务信息(服务名、服务说明等)以及相应的UDP端口号。服务信息的结构定义如下:
2.2 客户端查询注册进程模块
客户端的应用进程是需要使用RPC服务的应用程序,当应用进程需要调用RPC服务时,可根据服务名向注册进程发送查询请求;注册进程可以依据查询请求中携带的服务名,查找当前可以提供相应RPC服务的服务进程,并向应用进程发送反馈信息,反馈信息中可包含有提供RPC服务的各个服务进程的链接信息,包括:服务进程的IP地址、UDP端口号等。反馈信息的结构定义如下:
2.3 负载均衡策略
每个服务进程可以提供多个不同的RPC服务,因此,针对同一项RPC服务而言,可以提供该项RPC服务的服务进程可能有多个,即应用进程接收的反馈信息中可能包含有多个服务进程的相关信息。
系统应用进程设计按照可以依据负载均衡策略,选取出一个合适的服务进程作为目标服务进程,利用该目标服务进程提供相应的RPC服务。
2.4 客户端发送RPC服务请求模块
应用进程依据该链接信息,可向目标服务进程发送RPC服务请求。设计基于UDP通信的远程调用,将RPC服务请求以UDP数据包的形式发送到目标服务进程所在IP地址的UDP端口上,RPC服务请求中可以包含请求号、服务名、请求参数等信息。RPC服务请求的结构定义如下:
为了可以一次发送多个RPC服务请求,在RPC服务请求中增加了参数reqId,该参数在每个请求中都是不同了,唯一标识一个RPC服务请求消息。参数serviceName是请求的服务名。参数textArg和binArg是请求参数,格式是服务自定义的。为了方便使用,textArg使用扩展性好的JSON格式,保存可以用字符串表达的参数,binArg保存不能用字符串表达的参数,这样两种类型的参数已经可以覆盖业务需求,并且良好的扩展性,便于后期维护。
2.5 服务端执行对应的业务流程
目标服务进程提供的RPC服务可能有多个,依据RPC服务请求中携带的服务名,可以获知需要执行哪一项RPC服务,从而调用相应的业务流程。请求参数可以看做是该业务流程的输入参数,经过业务流程的处理,可以得到相应的执行结果。
2.6 服务端发送响应信息
业务进程可以一次发送多个RPC服务请求,为了便于区分每个RPC服务请求的执行结果,在响应信息中可以携带请求号和服务名,其中,该请求号和RPC服务请求中的请求号相同,该服务名是和RPC服务请求中的服务名相同。响应信息的结构定义如下,
响应消息中的参数reqId、serviceName和RPC服务请求中的参数是一致的,textResult保存可以用字符串表达的结果,binResult保存不能用字符串表达的结果。
2.7 客户端接收响应信息
如果响应信息的数据量很大,可以分为多个UDP包发送,在消息的包头中可以用消息的分片序号来标识每个数据包,在客户端的RPC接口层中进行重组后提交给上层。
3 结论
本文所提的基于UDP通信的远程过程调用方法,采用了对系统开销较小的UDP协议,设计了简单快捷的处理流程,快速的配置下发和状态查询功能既能满足轻量级应用程序的需求,又能减轻系统负担,在2/3/4/5G通信网业务功能设计、DPI设备系统、协议解析设备系统中有广泛的应用,特别适用于功能简单、网络情况良好的应用场景。