1、RPC基本概念

RPC,全称Remote Procedure Call Protocol,远程过程调用,简而言之就是客户端在不知晓底层技术实现细节的前提下,调用远程的服务如同调用本地的服务一样。RPC是一套协议规范,业界有很多开源的实现,在一个封闭的系统内部,为了保证系统内各个组件能够相互调用,RPC的协议规范要一致。RPC不需要上层用户了解具体传输层使用的协议,这是RPC自己来选择和决策的,当然实现较为灵活的RPC可以让上层用户指定具体的传输层协议。一般来讲,RPC支持在不同语言间进行调用,这是因为在越来越流程的微服务系统中,开发的语言是丰富的,支持提供服务的对象不应该要求客户端使用特定的语言。

一句话概括:RPC是指调用远程服务像调用本地服务一样方便,上层不感知实现细节。RPC常用于构建分布式系统及应用,简化分布式系统的实现难度。

2、RPC的流程

1)服务消费方(client)调用以本地调用方式调用服务;

2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)client stub找到服务地址,并将消息发送到服务端;

4)server stub收到消息后进行解码;

5)server stub根据解码结果调用本地的服务;

6)本地服务执行并将结果返回给server stub;

7)server stub将返回结果打包成消息并发送至消费方;

8)client stub接收到消息,并进行解码;

9)服务消费方得到最终结果。

列举一个RPC的实现例子:

3、RPC的关键技术

(1)序列化:消息序列化业界已有很多成熟的方案,例如protobuf、Json、TLV、XML等,序列化的选择要充分考虑消息的兼容性,字段的调整,类型的兼容等;

(2)可选的连接方式:短连接、长连接连接池、单链接等

(3)可选的发送形式:单节点发送、多节点发送、全节点发送(广播)

(4)支持可重试,例如指定无限重试、可选重试时间与重试次数等;对于RPC的重试,业务层需要考虑重试是否会导致业务错误,重试操作本身一定是业务级的幂等,即多次重试不会影响业务的计算结果。

(5)超时机制:分布式环境,由于网络原因,消息包可能丢失或是接收端Down机,此时需要返回发送端超时错误。

(6)合理路由:通过IP或者节点ID或者节点名等方式解析到具体的接收和发送节点;

(7)压缩:支持使用者选择是否使用压缩算法,以及选择具体的压缩方式。

4、RPC 业界实现

    随着分布式的发展,业界出现了很多RPC框架,例如ONC、DCE、Microsoft DCOM、JAVA RMI、WEB service(RPC变种),其中WEB Service实际上与RPC有一些区别:web service可以跨语言、穿防火墙等、无需使用系列的端口等特性,更加通用和简洁。

5、总结

RPC在分布式系统的发展中扮演了极其重要的角色,是连接各个独立阶段的桥梁,通过RPC,分布式系统组成了有机整体,实现相互的访问和回馈,支撑系统的整体运行。我们相信,随着IT技术的不断发展,微服务与云化逐步的深入,RPC作为一项基础技术,必将得到更大的发挥空间。

参考资料:

1、《你应该知道的RPC原理》https://wenku.baidu.com/view/548c728664ce0508763231126edb6f1afe007177.html;

2、百度开源框架BRPC https://github.com/brpc/brpc

3、Paul Krzyzanowski’s web site - Distributed Systems  https://www.cs.rutgers.edu/~pxk/417/notes/index.html