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

RPC主要解决三件事情:

  • 进程间通信
  • 提供和本地方法调用一样的调用机制
  • 屏蔽程序员对远程调用的细节实现
  1. RPC基本原理
  1. rpc对一些远程调用的内部实现进行封装:
  • 序列化
  • 编解码
  • 协议
  • 网络

       2. rpc远程调用过程:

  1. 服务消费方(client)调用以本地调用方式调用服务
  2. client stub接收到调用后负责将方法、参数等组成能够进行网络传输的消息体
  3. client stub找到服务地址,并将消息发送到服务端
  4. server stub收到消息后进行解码
  5. server stub根据解码结果调用本地服务
  6. 本地服务支持并将结果返回给server stub
  7. server stub将返回结果打包成消息并发送至消费方
  8. client stub接收到消息,并进行解码
  9. 服务消费方得到最终结果

rpc相当于将2至8步骤进行封装,如图:






2. RPC模型

      对于上图进一步拆解得到如下


上图解读:

  1. RPC服务端通过RpcServer去暴露服务接口,二客户端通过RpcClient去获取服务接口
  2. 客户端像调用本地方法一样去调用远程接口方法
  3. RPC框架提供接口的代理实现,实际的调用将委托给代理Rpcproxy,代理封装调用信息并将调用转给Rpcinvoker去实际执行。
  4. 在客户端的RpcInvoker通过连接器RpcConnect 去维持与 服务端的通道RpcChannel,并使用RpcProtocol执行协议编码(encode)并将编码后的请求消息通过通道发送给服务端。
  5. Rpc服务端接收器RpcAcceptor接收客户端的调用请求,同样使用RpcProtocol执行协议解码(decode),解码后的调用信息传递给RpcProcessor去控制处理调用过程,最后在委托调用给RpcInvoker去实际执行并返回调用结果。

通过上述分析可知,这里包含以下核心组件:


  • 用于暴露服务接口的RpcServer
  • 用于发现服务接口的RpcClient
  • 远程接口的代理实现RpcPorxy
  • 负责协议编解码的RpcProtocol(实际中rpc框架中一般会提供多种不同的实现)
  • 网络连接器

3. 常见的rpc框架:



  1. dubbo阿里巴巴公司开源的一个java高性能优秀的服务框架
  2. motan新浪微博开源的一个java框架
  3. gRPC Google开发的高性能、通用的开源RPC框架,主要面向移动应用开发并给予HTTP/2协议标准而设计,本身不是分布式的。

4. RPC与MQ



     MQ(message queue)消息队列,从某种程度上来说,同样可以实现RPC的功能,从功能特点上来说,MQ可以把消息存储,二rpc不行,简单对比如下