- 什么是 RPC?
RPC 就是 Remote Procedure Call 三个单词首字母的缩写,其字面意思为:远程过程
调用。而远程过程调用直观说法就是:进程 A 远程调用进程 B 的过程方法。既然是远程调
用则需要涉及网络传输,由此可见 RPC 主要应用于不同主机间的过程调用,也可用于本机
中不同进程之前的过程调用。
简单的说,RPC 就是从一台主机上的进程 A 通过参数传递的方式调用另一台主机上的
进程 B 中的一个函数,并得到返回的结果。因此 RPC 具有以下特点:
a. RPC 会隐藏底层的通讯细节,不需要直接处理如何通信及收发数据。
b. RPC 是一个请求响应模型。客户端发起调用请求,服务端返回请求响应,这类似于
HTTP 的工作方式。
c. RPC 在使用形式上像调用本地函数一样去调用远程的函数。
- 为什么要用 RPC?
在以前的单机时代,一台主机上可以运行多个进程,假如进程 A 和 B 都要控制打印机
进行打印,而打印机同时只能被一个进程控制操作,这要怎么办才好呢?为了解决这一问题
系统提供了打印服务 C 进程,C 进程有打印任务队列,A 和 B 进程把需要打印生成一个打
印任务,然后向 C 进程提交请求即可。A 和 B 进程与 C 进程之间通信就是 IPC,IPC 就
是 Inter-Process Communication 缩写,其主要功能就是单机中进程之间的相互通信。
到了网络时代,不可能每台主机都配置一台打印机,不同主机需要访问带打印机的主机
时 IPC 已无能为力。这时就需要把IPC 扩展到网络上,而网络通信有很多通讯协议,如:
TCP、UDP等等。不同通讯协议的控制方式不同,这给开发人员带来困难,只要不同主机之间
涉及网络通信,其需要考虑的因素就非常多了,如:网速、断线、延时、私有性、安全性等
等。于是 RPC 就是为简化远程调用应运而生了,开发人员使用 RPC 时无须考虑如何握手连
接、如何收发数据等等问题。
什么时候要用到 RPC 呢?就是无法在单个进程内,甚至单个主机内通过本地调用的方
式完成的需求,比如不同的系统之间的通讯,甚至不同的组织间的通讯。例如计算能力需要
横向扩展,需要在多台主机组成的集群上部署应用,同时要简化通讯细节,这时 RPC 框架
就发挥作用了。集群部署的本质就是分布式服务,由此可见 RPC 框架是分布式服务的基石,
实现 RPC 框架需要考虑方方面面。其对业务隐藏了底层通信过程: TCP/UDP通讯协议、函数
参数打包/解包、参数数据序列化/反序列化,使开发人员专注于功能实现。
3.RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。两方面会直接影响 RPC 的性能,一是传输方式,二是序列化。
众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,因此,在一般情况下,TCP 一定比 HTTP 快。就序列化而言,Java 提供了默认的序列化方式,但在高并发的情况下,这种方式将会带来一些性能上的瓶颈,于是市面上出现了一系列优秀的序列化框架,比如:Protobuf、Kryo、Hessian、Jackson 等,它们可以取代 Java 默认的序列化,从而提供更高效的性能。
Spring:它是最强大的依赖注入框架,也是业界的权威标准。
Netty:它使 NIO 编程更加容易,屏蔽了 Java 底层的 NIO 细节。
Protostuff:它基于 Protobuf 序列化框架,面向 POJO,无需编写 .proto 文件。
ZooKeeper:提供服务注册与发现功能,开发分布式系统的必备选择,同时它也具备天生的集群能力。