RPC (Remote Procedure Call)是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。
RPC 结构
1. User
2. User-stub
3. RPCRuntime
4. Server-stub
5. Server
这里 user 就是 client 端,当 user 想发起一个远程调用时,它实际是通过本地调用 user-stub。user-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime实例传输到远端的实例。远端RPCRuntime 实例收到请求后交给server-stub 进行解码后发起本地端调用,调用结果再返回给 user 端。
RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用,主要是基于 stub 的结构来实现。
RPC调用分为以下两类:同步和异步的区别就在于是否等待服务端执行完并返回结果。
1.同步调用:client方等待调用执行完成并返回结果;
2.异步调用:client方调用后无需等待结果返回,只是通过回调通知等方式获取返回结果,即变成单向异步调用。
RPC结构进一步拆解
RPC服务方通过RpcServer去export远程接口方法,而RPC客户方通过RpcClient去import远程接口方法。Client方像调用本地方法一样去调用远程接口方法,RPC框架提供接口的代理实现,实际的调用将委托给代理方RpcProxy,代理封装好调用信息并将调用转交给RpcInvoker去实际执行。在客户端的RpcInvoker通过连接器RpcConnector去维持与server端的通道RpcChannel,并使用RpcProtocol执行协议编码(encode)并将编码后的请求消息通过RpcChannel发送给服务方。
RPC服务端接收器RpcAcceptor接收client端的调用请求,同样使用RpcProtocol执行协议解码(decode)并将调用信息传递给RpcProcessor去控制处理调用过程,最后再委托调用给RpcInvoker去实际执行并返回调用结果。