定义
RPC(Remote Procedure Call)远程过程调用,是一种进程间通信方式。通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。
结构
实现RPC的程序需要5个部分
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 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。
- 客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。
- 代理封装调用信息并将调用转交给RpcInvoker 去实际执行。
- 在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。
- RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。
- 解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果。
如下是各个部分的详细职责:
- RpcServer
负责导出(export)远程接口- RpcClient
负责导入(import)远程接口的代理实现- RpcProxy
远程接口的代理实现- RpcInvoker
客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回
服务方实现:负责调用服务端接口的具体实现并返回调用结果- RpcProtocol
负责协议编/解码- RpcConnector
负责维持客户方和服务方的连接通道和发送数据到服务方- RpcAcceptor
负责接收客户方请求并返回请求结果- RpcProcessor
负责在服务方控制调用过程,包括管理调用线程池、超时时间等- RpcChannel
数据传输通道
工作原理
RPC的设计由Client,Client stub,Network ,Server stub,Server构成。
- 其中Client就是用来调用服务的。
- Cient stub是用来把调用的方法和参数序列化的(因为要在网络中传输,必须要把对象转变成字节)。
- Network用来传输这些信息到Server stub。
- Server stub用来把这些信息反序列化的。
-
Server就是服务的提供者,最终调用的就是Server提供的方法。
RPC工作原理
1. Client像调用本地服务似的调用远程服务;
2. Client stub接收到调用后,将方法、参数序列化
3. 客户端通过sockets将消息发送到服务端
4. Server stub 收到消息后进行解码(将消息对象反序列化)
5. Server stub 根据解码结果调用本地的服务
6. 本地服务执行(对于服务端来说是本地执行)并将结果返回给Server stub
7. Server stub将返回结果打包成消息(将结果消息对象序列化)
8. 服务端通过sockets将消息发送到客户端
9. Client stub接收到结果消息,并进行解码(将结果消息反序列化)
10. 客户端得到最终结果。
RPC 调用分以下两种:
- 同步调用:客户方等待调用执行完成并返回结果。
-
异步调用:客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
异步和同步的区分在于是否等待服务端执行完成并返回结果。
作用
RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。