RPC原理技术
- 背景
- 介绍
- 起源
- 组件实现
- 工作原理
背景
本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。
介绍
RPC,Remote Procedure Call,远程过程调用,允许像调用本地方法一样调用远程服务,主要解决跨内存空间调用函数/方法所面临的问题,具体分解成以下三个问题:
- 如何确定要执行的函数?
在本地调用中,函数主体通过函数指针函数指定,RPC中不能使用函数指针函数,因为内存地址完全不同。因此,调用方和被调用方都需要维护一个function <-> ID
映射表,以确保能够调用正确的函数。 - 如何表达参数?
本地过程调用中传递的参数是通过堆栈内存结构实现的,RPC不能直接使用内存传递参数,因此参数或返回值需要在传输期间序列化并转换成字节流,反之亦然。 - 如何进行网络传输?
函数的调用方和被调用方通常是通过网络连接的,即function ID
和序列化字节流需要通过网络传输,因此只要能够完成传输,调用方和被调用方就不受某个网络协议的限制。例如,一些RPC框架使用TCP协议,一些使用HTTP协议。
起源
RPC由Bruce Jay Nelson在其论文《Implementing Remote Procedure Calls》中提出,论文中说明的RPC程序包含5部分:
- User
- User Stub
- RPC Runtime
- Server Stub
- Server
流程说明:
- User:作为RPC客户端发起远程调用(像调用本地方法一样)。
- User Stub:接收到来自 User 的远程调用请求后,编码调用的接口、方法和参数,并交给RPC客户端的 RPC Runtime 实例进行传输;
- RPC Runtime:RPC客户端的 RPC Runtime 实例执行传输后等待;
- RPC Runtime:RPC服务端的 RPC Runtime 实例接收到来自RPC客户端的远程调用请求后,将请求转发给RPC服务端的 Server Stub 处理;
- Server Stub:对接收到的请求进行解码,然后转发给RPC服务端的 Server 处理;
- Server:RPC服务端发起本地调用,将结果返回给RPC服务端的 Server Stub;
- Server Stub:对请求处理结果进行编码,然后交给RPC服务端的 RPC Runtime 实例进行传输;
- RPC Runtime:RPC服务端的 RPC Runtime 实例传输编码后的请求处理结果;
- RPC Runtime:RPC客户端的 RPC Runtime 实例接收到请求处理结果后,将结果转发给RPC客户端的 User Stub 处理;
- User Stub:对请求处理结果进行解码,返回给 User。
组件实现
- RPC Server
RPC服务端通过 RPC Server 组件导出(export)远程接口。 - RPC Client
RPC客户端通过 RPC Client 组件导入(import)远程接口的代理实现。 - RPC Proxy
远程接口的代理实现,实际的调用请求便是委托给 RPC Proxy 执行:封装调用信息,并将调用转交给 RPC Invoker 去实际执行。 - RPC Invoker
- 客户端:通过 RPC Connector 维持与服务端的通道 RPC Channel,并使用 RPC Protocol执行协议编码(encode),并将编码后的请求消息通过通道发送给服务端。
- 服务端:负责调用服务端接口的具体实现并返回调用结果。
- RPC Protocol:负责协议编解码。
- RPC Connector:负责维持客户端和服务端之间的连接通道,并负责数据传输。
- RPC Acceptor:负责接收客户端请求,同样使用 RPC Protocol 执行协议解码(decode)。
- RPC Processor:接收解码后的调用信息,在服务端控制调用过程,包括管理调用线程池、超时时间等。
- RPC Channel:数据传输通道。
工作原理
流程说明:
- Client像调用本地方法一样调用远程服务;
- Client Stub接收到调用请求后执行编码操作,将方法及参数进行序列化;
- Client Socket将消息发送给Server Socket;
- Server Socket接收到请求消息后发送给Server Stub;
- Server Stub对请求消息进行解码,并根据解码结果调用本地方法;
- Server本地方法执行,将执行结果返回给Server Stub;
- Server Stub对执行结果进行编码,并交由Server Socket进行传输;
- Server Socket将编码后的结果发送给Client Socket;
- Client Socket将结果交给Client Stub处理;
10.Client Stub对结果进行解码并返回。