初步了解RPC
Salted Fish 1991/6/26 RPC
# 1. 什么是RPC
RPC(Remote Procedure Call,远程过程调用)是一种进程间的通信方式,它是一种技术思想(概念),而不是规范,它允许程序调用另一个地址空间(通常是共享网络的另一台机器)的过程函数,而开发者无需额外地为这个调用过程编写网络通信相关代码细节。
通俗的解释:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。
# 2.远程调用和本地调用

# 3. HTTP和RPC区别
# 3.1 从概念区分
一句话概括:
RPC是概念,HTTP是协议,RPC通信协议,可以基于HTTP协议,也可以基于TCP、UDP。

RPC调用协议通常包含传输协议 和 序列化协议,常用的传输协议是TCP、常用的序列化协议是Protobuf,当然也支持其他协议,具体可见上图。
# 3.2 从传输协议上区分
HTTP只能基于HTTP协议,而且HTTP属于应用层协议。RPC可以基于HTTP、TCP、UDP协议,而其中TCP、UDP属于传输层协议。
HTTP和RPC本质的区别,还是在传输协议上,虽然HTTP和RPC底层都是通过TCP协议,但是RPC走的是自定义TCP协议,两者主要的区别是在传输报文上,
HTTP1.1协议的tcp报文:
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 2021 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36
<html>
<body>我是有效的消息</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
从上面整个报文可以看出,有效消息Body在整个消息中,占比低,而无效消息Header占比却很大,即使将Body使用二进制编码协议,也无法减少整个报文体积,而RPC的自定义TCP协议,就是为了去掉报文中无效的信息。
# 3.3 从OSI网络模型区分
HTTP位于应用层协议,RPC常用的自定义TCP位于传输层协议,完整的OSI七层网络模型,如下图:(可图片百度)

# 4. RPC调用流程图

# 5. 常见的RPC框架
# 5.1 跟语言绑定框架
Dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持Java语言。Motan:微博内部使用的RPC框架,于 2016 年对外开源,仅支持Java语言。Tars:腾讯内部使用的RPC框架,于 2017 年对外开源,仅支持C++语言。Spring Cloud:国外Pivotal公司 2014 年对外开源的RPC框架,仅支持Java语言。
# 5.2 跨语言开源框架
gRPC:Google于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。Thrift:最初是由Facebook开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。