RPC简介
在分布式计算中,远程过程调用(remote procedure call,RPC)是指计算机程序使一个过程(子程序)在不同的地址空间(通常在共享网络上的另一台计算机上)执行,该地址空间的编码方式与普通(本地)过程调用的编码方式相同,而程序员无需为远程交互明确编码细节。也就是说,无论子例程是执行程序本地的还是远程的,程序员编写的代码基本上是相同的。 这是客户端-服务器交互的一种形式(调用者是客户端,执行者是服务器),通常是通过请求-响应消息传递系统来实现的。
RPC是进程间通信(IPC)的一种形式,因为不同的进程具有不同的地址空间:如果在同一主机上,即使物理地址空间相同,它们也具有不同的虚拟地址空间;如果它们位于不同的主机上,则物理地址空间是不同的。
RPC模型意味着一个位置透明的级别,即调用过程在很大程度上是相同的,不管它是本地的还是远程的,但是它们通常是不相同的,因此本地调用可以与远程调用区分开来。远程调用通常比本地调用慢几个数量级,可靠性也较低,因此区分它们很重要。
RPC的核心并不在于使用什么协议。RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署在哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式,至于http协议,只是传输协议而已。
简单的说,
- RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
- RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)。
- RPC 是一个请求响应模型,客户端发起请求,服务器返回响应。RPC 在使用形式上像调用本地方法一样去调用远程方法。
RPC要解决的两个问题
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
RPC 框架的核心组成
- 客户端(Client):服务调用方。
- 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
- 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
- 服务端(Server):服务的真正提供者。
- Network Service:底层传输,可以是 TCP 或 HTTP。
RPC流程
- 客户端调用客户端存根(client stub)。这个调用是在本地,并将调用参数push到栈(stack)中。
- 客户端存根(client stub)将这些参数(接口、方法、参数)包装,并通过系统调用发送到服务端机器。 打包的过程叫 marshalling 。(常见方式:XML、JSON、二进制编码)
- 客户端本地操作系统发送信息至服务器。(可通过自定义TCP协议或HTTP传输)
- 服务器系统将信息传送至服务端存根(server stub),并解析信息。该过程叫 unmarshalling 。
- 服务端存根(server stub)调用本地程序进行业务处理,并通过类似的方式返回给客户端。