RPC原理

实现高可用RPC框架需要考虑到的问题

  1. 既然系统采用分布式架构,那一个服务势必会有多个实例,要解决如何获取实例的问题。所以需要一个服务注册中心,比如在 Dubbo 中,就可以使用 Zookeeper 作为注册中心,在调用时,从 Zookeeper 获取服务的实例列表,再从中选择一个进行调用;
  2. 如何选择实例呢?就要考虑负载均衡,例如 dubbo 提供了 4 种负载均衡策略;
  3. 如果每次都去注册中心查询列表,效率很低,那么就要加缓存;
  4. 客户端总不能每次调用完都等着服务端返回数据,所以就要支持异步调用;
  5. 服务端的接口修改了,老的接口还有人在用,这就需要版本控制;
  6. 服务端总不能每次接到请求都马上启动一个线程去处理,于是就需要线程池;

理论结构模型

01_RPC实现原理.png

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

RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用 RpcProtocol 执行协议解码(decode)。

解码后的调用信息传递给 RpcProcessor 去控制处理调用过程,最后再委托调用给 RpcInvoker 去实际执行并返回调用结果。

02_RPC实现原理.png