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 开源项目之一,支持多种语言。