RPC简介

RPC概念

RPC(Remote Procedure Call)远程过程调用,即允许网络中一个节点请求另一个节点提供的服务,其中不用程序员显式编码这个远程调用的细节(由RPC框架处理远程调用细节)。目的是使得调用远程方法像是直接调用本地方法一样。

首先需要理清楚本地过程调用和远程过程调用的区别:

  • 本地过程调用:直接调用本地的函数,函数本身已经在内存上,只需要修改指针,压栈传递参数即可。我们一般调用本地服务都是这种方式。
  • 远程过程调用:需要调用远程服务器的函数,函数内容不在自己的内存上,只能通过网络传输请求和参数,远程服务器执行函数并返回结果。

RPC框架:

RPC简介

一次完整的RPC调用流程如下:

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

RPC框架的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。

其中的细节有:

  • 服务端如何确定客户端要调用哪个函数:在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
  • 如何进行序列化和反序列化:客户端和服务端交互时将参数或结果转化为字节流在网络中传输。
    • 序列化:数据转化为字节流。
    • 反序列化:字节流转换成固定格式的数据。
  • 网络传输选择何种网络协议:多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。TCP更加高效,而HTTP在实际应用中更加的灵活。

参考

RPC原理及实现

什么是RPC?

面试问题:REST与RPC区别?