远程服务将计算机程序的工作范围从单机扩展到网络,从本地延伸至远程,是构建分布式系统的首要基础。而远程服务又不仅仅是为了分布式系统服务的,在网络时代,浏览器、移动设备、桌面应用和服务端的程序,普遍都有跟其他设备交互的需求。
RPC 本身解决什么问题、如何解决这些问题、为什么要这样解决。
RPC - 面向过程的远程调用
无论何种远程调用手段,都是在解决一下三个问题:
-
如何表示数据?包括传递的调用参数数据和返回值的数据。不同的系统环境中,存在不同的数据识别细节,为解决这种问题,有效的做法是将交互双方所涉及的数据转换为某种事先约定好的中立数据流格式来进行传输,将数据流转换回不同语言中对应的数据类型来进行使用。这也是大家熟知的序列化和反序列化。每种RPC协议都有对应的序列化协议,如ProtoBuf,JSON,XML,JDK序列化
-
如何传递数据?准确地说,是指如何通过网络,在两个服务的 Endpoint 之间相互操作、交换数据。这里“交换数据”通常指的是应用层协议,实际传输一般是基于标准的 TCP、UDP 等标准的传输层协议来完成的。两个服务交互不是只扔个序列化数据流来表示参数和结果就行的,许多在此之外信息,譬如异常、超时、安全、认证、授权、事务,等等,都可能产生双方需要交换信息的需求。
-
如何确定方法?面临跨语言的方法定义不同的问题。
以上 RPC 中的三个基本问题,全部都可以在本地方法调用过程中找到相对应的操作。RPC 的想法始于本地方法调用,尽管早已不再追求实现成与本地方法调用完全一致,但其设计思路仍然带有本地方法调用的深刻烙印,抓住两者间的联系来类比,对我们更深刻地理解 RPC 的本质会很有好处。