RPC 功能目标
RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用,在前文《浅出篇》中给出了一种实现结构,基于 stub 的结构来实现。下面我们将具体细化 stub 结构的实现。
RPC 调用分类
RPC 调用分以下两种:
- 1. 同步调用
- 客户方等待调用执行完成并返回结果。
- 2. 异步调用
- 客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。
- 若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
异步和同步的区分在于是否等待服务端执行完成并返回结果。
RPC 结构拆解
《浅出篇》给出了一个比较粗粒度的 RPC 实现概念结构,这里我们进一步细化它应该由哪些组件构成,如下图所示。
RPC 服务方通过 RpcServer
去导出(export)远程接口方法,而客户方通过 RpcClient
去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy
。代理封装调用信息并将调用转交给RpcInvoker
去实际执行。在客户端的RpcInvoker
通过连接器RpcConnector
去维持与服务端的通道RpcChannel
,并使用RpcProtocol
执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。
RPC 服务端接收器 RpcAcceptor
接收客户端的调用请求,同样使用RpcProtocol
执行协议解码(decode)。解码后的调用信息传递给RpcProcessor
去控制处理调用过程,最后再委托调用给RpcInvoker
去实际执行并返回调用结果。