Remote Procedure Call
Remote Procedure Call
当 A 机器中程序想要调用 B 机器中的程序时,A 中进程会被挂起,而 B 机器接着执行;B 机器在返回后,会把运算结果的数据传回给 A 机器的进程,A 机器获得调用结果后在接着执行,这种机制叫作 RPC(Remote Procedure Call)——远程过程调用。
RPC 协议
RPC 协议是一种通过网络向远程计算机程序请求服务,而不需要了解底层网络技术的协议。
RPC 协议以传输协议(TCP、UDP、HTTP)为基础,跨穿于 OSI 的传输层和应用层之间,通过利用现有的基础网络协议及自己良好的封装性,适用于基于网络的分布式应用开发。
RPC 调用原理
- 连接:通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。
- 寻址:A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口。
- 编码:网络协议是基于二进制的,内存中的参数的值要序列化成⼆进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
- 解码:B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的⼀部分)进行本地调用,然后得到返回值。
- 处理返回值:返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式,交给A服务器上的应用。
RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至Rest API
- 客户端函数调用本地的客户端存根方法,对于客户端函数来说就是在调用一个普通的本地方法。
- 客户端存根方法将客户端函数请求参进行 Encode (特定语言 => 标准网络格式),通过系统调用操作内核提供的 Socket 套接字接口向服务端发送消息。
- 网络消息由内核通过某种协议(TCP、UDP)传送到服务端。
- 服务端套接字转发消息至服务端存根。
- 服务端存根接收到客户端发送的消息,并进行 Decode。(标准网络格式 => 特定语言),接着服务端存根调用服务端函数,并将从客户端接收到的参数传递给服务端函数。
- 服务端的方法在执行完成后会把结果返回到服务端存根代码中。
- 服务端存根将返回值进行 Encode 并序列化,通过系统调用操作内核提供的 Socket 套接字接口向客户端发送消息。
- 网络消息由内核通过某种协议(TCP、UDP)传送到服务端。
- 客户端存根从本地 Socket 接口中读取结果消息。
- 客户端存根将消息进行 Decode,并将结果返回给客户端函数。
通过原理分析,不难发现 RPC 主要有以下三大优点:
- 可以方便地使用 RPC 调用远程函数,就像调用本地方法一样。
- 编写分布式应用更加简单、容易,因为 RPC 将所有的网络层面代码都隐藏到了存根函数中,开发人员不必考虑通信机制,也不必陷入套接字、端口号、数据转换和解析等细节问题汇总。
- RPC 是构建在语言层面之上的,是跨语言的。
在程序中使用 RPC 服务
为了让语言支持远程过程调用,通常需要提供一个单独的编译器来生成客户端和服务器端的存根函数,存根函数由编译器从开发者指定的远程调用接口定义文件中生成,此文件使用一种叫做IDL(interface definition language)的接口定于语言编写,用来化解各个语言之间的特殊性,使用不同语言可以通过 RPC 相互调用彼此服务,实现服务的最大重用性。
RPC 服务的演变过程
- 第一代 PRC:面试过程的函数式编程。
- 第二代 RPC:面向对象编程。
- 第三代 RPC:SOA 和微服务,框架已经超越了 RPC 本身,主要是面向服务的实现,实现了服务的管理和治理,提供了服务的监控的方法。
常见服务间调用方式对比 REST(HTTP) VS RCP
传输协议
- RPC:TCP、UDP、HTTP2.0
- HTTP:HTTP1.1、HTTP2.0
数据包大小
- RPC:小
- HTTP:大
使用场景
- RPC:企业内部
- HTTP:企业外部、企业内部