RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。
1.RPC框架原理
RPC基本架构如下图所示:
RPC 架构主要包括三部分:
(1)服务注册中心(Registry),负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
(2)服务提供者(Server),提供服务接口定义与服务实现类。
(3)服务消费者(Client),通过远程代理对象调用远程服务。
服务提供者启动后主动向服务注册中心(Registry)注册机器IP、端口以及提供的服务列表;
服务消费者启动时向服务注册中心(Registry)获取服务提供方地址列表。
服务注册中心(Registry)可实现负载均衡和故障切换。
2.RPC调用过程
RPC调用过程如下图所示:
RPC的调用过程可分为以下10个步骤:
(1) 客户端(client)以本地调用方式调用服务;
(2) 客户端存根(client stub)接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(将消息体对象序列化为二进制);
(3) 客户端通过 sockets 将消息发送到服务端;
(4) 服务端存根(server stub)收到消息后进行解码(将消息对象反序列化);
(5) 服务端存根(server stub)根据解码结果调用本地的服务;
(6) 本地服务执行并将结果返回给服务端存根(server stub);
(7) 服务端存根(server stub)将返回结果打包成消息(将结果消息对象序列化);
(8) 服务端(server)通过 sockets 将消息发送到客户端;
(9) 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息发序列化);
(10) 客户端(client)得到最终结果。
RPC 就是要把 2、3、4、7、8、9 这些步骤都封装起来。
3.RPC的优缺点
RPC主要有以下优点:
(1)跨语言
(2)协议私密,安全性较高
(3)数据传输效率高
(4)支持动态扩展
RPC缺点也比较明显:一个完善的 RPC框架 开发难度大,需要的专业人员比较多,对初学者难度比较大。
4.RPC与HTTP对比
RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。
HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。
RPC 使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC):
(1)长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。
(2)注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
(3)安全性,没有暴露资源操作。
(4)微服务支持。就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。
5.RPC与RESTful API对比
从资源粒度角度看:RPC 就像本地方法调用,RESTful API 每一次添加接口都可能需要额外地组织开放接口的数据,这相当于在应用视图中再写了一次方法调用,而且它还需要维护开发接口的资源粒度、权限等。
从流量消耗角度看:RESTful API 在应用层使用 HTTP 协议,哪怕使用轻型、高效、传输效率高的 JSON 也会消耗较大的流量,而 RPC 传输既可以使用 TCP 也可以使用 UDP,而且协议一般使用二制度编码,大大降低了数据的大小,减少流量消耗。
对接异构第三方服务时,通常使用 HTPP/RESTful 等公有协议,对于内部的服务调用,应用选择性能更高的二进制私有协议。
6.RPC与RMI对比
虽然都是远程调用,RPC与RMI主要有以下三点区别。
6.1.区别一:方法调用方式不同
RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。
6.2.区别二:适用语言范围不同
RMI只用于Java;
RPC是网络服务协议,与操作系统和语言无关。
6.3.区别三:调用结果的返回形式不同
Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;
RMI的结果统一由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。