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报文:
|
从上面整个报文可以看出,有效消息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 开源项目之一,支持多种语言。







