一、RPC的概念

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。

说白了就是调用远程方法跟调用本地方法似的。

二、功能目标

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。

三、RPC的架构

  • User
  • User-stub
  • RPCRuntime
  • Server-stub
  • Server

架构图如下:

rpcuser rpcuser有啥用_rpcuser

这里 user 就是 client 端,当 user 想发起一个远程调用时,它实际是通过本地调用 user-stub。user-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。远端 RPCRuntime 实例收到请求后交给 server-stub 进行解码后发起本地端调用,调用结果再返回给 user 端。

上面的图是个粗粒度的,下面来个细粒度的架构图:

rpcuser rpcuser有啥用_java_02

RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果。

各组件解释:

1. RpcServer

    负责导出(export)远程接口

2. RpcClient

    负责导入(import)远程接口的代理实现

3. RpcProxy

    远程接口的代理实现

4. RpcInvoker

    客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回

    服务方实现:负责调用服务端接口的具体实现并返回调用结果

5. RpcProtocol

    负责协议编/解码

6. RpcConnector

    负责维持客户方和服务方的连接通道和发送数据到服务方

7. RpcAcceptor

    负责接收客户方请求并返回请求结果

8. RpcProcessor

    负责在服务方控制调用过程,包括管理调用线程池、超时时间等

9. RpcChannel

    数据传输通道