1、什么是RPC?
RPC(Remote Procedure Call)
中文名「远程过程调用」,又是一个很蹩脚的翻译。我们拆开理解下,「过程」也叫方法或函数,「远程」就是说方法不在当前进程里,而是在其他进程或机器上面,合起来 RPC 就是调用其他进程或机器上面的函数。
在没有网络的时代,程序都是单机版的,所有逻辑都必须在同一个进程里。进程之间就像高楼大厦里面陌生的邻居,大家无法共享,遇到同样的功能只能重复实现一次。显然进程的障碍是逆天的,不符合先进生产力的发展方向,这个时候「进程间通信」的需求出现了,大家要求进程之间能够相互交流,相互共享和调用。这样再写程序,就可以利用进程间通信机制来调用和共享已经存在的功能了。随着网络的出现,进程的隔阂进一步消除,不光同一栋楼里的邻居可以共享资源,其他小区、甚至其他城市的居民都可以通过互联网互相调用,这就是RPC
。概念很容易理解,但是远程和本地的实现原理有很大区别,架构设计者的职责就是设计一个机制让远程调用服务就像调本地服务一样简单,这就是RPC
框架。
2、基本原理
RPC
首要解决的是通讯的问题,主流的 RPC
框架分为基于 HTTP
和基于 TCP
的两种。基于 HTTP
的 RPC
调用很简单,就和我们访问网页一样,只是它的返回结果更单一(JSON
或 XML
)。它的优点在于实现简单,标准化和跨语言,比较适合对外提供 OpenAPI
的场景,而它的缺点是 HTTP
协议传输效率较低、短连接开销较大(HTTP 2.0
后有很大改进)。而基于 TCP
的 RPC
调用,由于 TCP
协议处于协议栈的下层,能够更加灵活地对协议字段进行定制,减少网络开销,提高性能,实现更大的吞吐量和并发数。但是需要更多地关注底层复杂的细节,跨语言和跨平台难度大,实现的代价更高,它比较适合内部系统之间追求极致性能的场景。
接下我讲的 RPC
都是基于 TCP
的,因为它是目前业界主流 RPC
框架支持的方式,也是阿里的 HSF
,蚂蚁的 Bolt
采用的方式。首先来看看一个 RPC
调用的基本流程,以便大家对它有宏观的认识,后面再逐一讨论其中的细节
- 调用方(
Client
)通过本地的RPC
代理(Proxy
)调用相应的接口 - 本地代理将
RPC
的服务名,方法名和参数等等信息转换成一个标准的RPC Request
对象交给RPC
框架 -
RPC
框架采用RPC
协议(RPC Protocol
)将RPC Request
对象序列化成二进制形式,然后通过 TCP 通道传递给服务提供方 (Server
) - 服务端(
Server
)收到二进制数据后,将它反序列化成RPC Request
对象 - 服务端(
Server
)根据RPC Request
中的信息找到本地对应的方法,传入参数执行,得到结果,并将结果封装成RPC Response
交给RPC
框架 -
RPC
框架通过RPC
协议(RPC Protocol
)将RPC Response
对象序列化成二进制形式,然后通过TCP
通道传递给服务调用方(Client
) - 调用方(
Client
)收到二进制数据后,将它反序列化成RPC Response
对象,并且将结果通过本地代理(Proxy
)返回给业务代码
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。