RPC简介
RPC概念
RPC(Remote Procedure Call)远程过程调用,即允许网络中一个节点请求另一个节点提供的服务,其中不用程序员显式编码这个远程调用的细节(由RPC框架处理远程调用细节)。目的是使得调用远程方法像是直接调用本地方法一样。
首先需要理清楚本地过程调用和远程过程调用的区别:
- 本地过程调用:直接调用本地的函数,函数本身已经在内存上,只需要修改指针,压栈传递参数即可。我们一般调用本地服务都是这种方式。
- 远程过程调用:需要调用远程服务器的函数,函数内容不在自己的内存上,只能通过网络传输请求和参数,远程服务器执行函数并返回结果。
RPC框架:
一次完整的RPC调用流程如下:
- client以本地调用方式调用服务;
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
- client stub找到服务地址,并将消息通过网络传输发送到服务端;
- server stub收到消息后进行解码;
- server根据server stub的解码结果调用本地的服务,并将结果返回给server stub;
- server stub将返回结果打包成消息体并发送给client;
- client stub接收到消息,并进行解码;
- client得到最终结果。
RPC框架的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。
其中的细节有:
- 服务端如何确定客户端要调用哪个函数:在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
- 如何进行序列化和反序列化:客户端和服务端交互时将参数或结果转化为字节流在网络中传输。
- 序列化:数据转化为字节流。
- 反序列化:字节流转换成固定格式的数据。
- 网络传输选择何种网络协议:多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。TCP更加高效,而HTTP在实际应用中更加的灵活。
参考