最通俗的语言讲清楚RPC和HTTP

随着企业 IT 服务的不断发展,单台服务器逐渐无法承受用户日益增长的请求压力时,就需要多台服务器联合起来构成「服务集群」共同对外提供服务 。同时业务服务会随着产品需求的增多越来越肿,架构上必须进行服务拆分,一个完整的大型服务会被打散成很多很多独立的小服务,每个小服务会由独立的进程去管理来对外提供服务,这就是「微服务」 。
当用户的请求到来时,我们需要将用户的请求分散到多个服务去各自处理,然后又需要将这些子服务的结果汇总起来呈现给用户 。那么服务之间该使用何种方式进行交互就是需要解决的核心问题 。RPC 就是为解决服务之间信息交互而发明和存在的 。
什么是 RPC ?
RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法,已经有 40 多年历史 。当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手段之一 。除 RPC 之外,常见的多系统数据交互方案还有分布式消息队列、HTTP 请求调用、数据库和分布式缓存等 。

最通俗的语言讲清楚RPC和HTTP

文章插图
 
其中 RPC 和 HTTP 调用是没有经过中间件的,它们是端到端系统的直接数据交互 。HTTP 调用其实也可以看成是一种特殊的 RPC,只不过传统意义上的 RPC 是指长连接数据交互,而 HTTP 一般是指即用即走的短链接 。
RPC 在我们熟知的各种中间件中都有它的身影 。Nginx/redis/MySQL/Dubbo/Hadoop/Spark/Tensorflow 等重量级开源产品都是在 RPC 技术的基础上构建出来的,我们这里说的 RPC 指的是广义的 RPC,也就是分布式系统的通信技术 。RPC 在技术中的地位好比我们身边的空气,它无处不在,但是又有很多人根本不知道它的存在 。
Nginx 与 RPC
Ngnix 是互联网企业使用最为广泛的代理服务器 。它可以为后端分布式服务提供负载均衡的功能,它可以将后端多个服务地址聚合为单个地址来对外提供服务 。如图,Django 是 Python 技术栈最流行的 Web 框架 。
最通俗的语言讲清楚RPC和HTTP

文章插图
 
Nginx 和后端服务之间的交互在本质上也可以理解为 RPC 数据交互 。也许你会争辩说 Nginx 和后端服务之间使用的是 HTTP 协议,走的是短连接,严格上不能算是 RPC 调用 。
最通俗的语言讲清楚RPC和HTTP

文章插图
 
你说的没错,不过 Nginx 和后端服务之间还可以走其它的协议,比如 uwsgi 协议、fastcgi 协议等,这两个协议都是采用了比 HTTP 协议更加节省流量的二进制协议 。如上图所示,uWSGI 是著名的 Python 容器,使用它可以启动 uwsgi 协议的服务器对外提供服务 。
uwsgi 通讯协议在 Python 语言体系里使用非常普遍,如果一个企业内部使用 Python 语言栈搭建 Web 服务,那么他们在生产环境部署 Python 应用的时候不是在使用 HTTP 协议就是在使用 uwsgi 协议来和 Nginx 之间建立通讯 。
最通俗的语言讲清楚RPC和HTTP

文章插图
 
Fastcgi 协议在 php 语言体系里非常常见,Nginx 和 PHP-fpm 进程之间一般较常使用 Fastcgi 协议进行通讯 。
Hadoop 与 RPC
在大数据技术领域,RPC 也占据了非常重要的地位 。大数据领域广泛应用了非常多的分布式技术,分布式意味着节点的物理隔离,隔离意味着需要通信,通信意味着 RPC 的存在 。大数据需要通信的量比业务系统更加庞大,所以在数据通信优化上做的更深 。
最通俗的语言讲清楚RPC和HTTP

文章插图
 
比如最常见的 Hadoop 文件系统 hdfs,一般包括一个 NameNode 和多个 DataNode,NameNode 和 DataNode 之间就是通过一种称为 Hadoop RPC 的二进制协议进行通讯 。
TensorFlow 与 RPC
在人工智能领域,RPC 也很重要,著名的 TensorFlow 框架如果需要处理上亿的数据,就需要依靠分布式计算力,需要集群化,当多个分布式节点需要集体智慧时,就必须引入 RPC 技术进行通讯 。Tensorflow Cluster 的 RPC 通讯框架使用了 google 内部自研的 gRPC 框架 。
最通俗的语言讲清楚RPC和HTTP

文章插图
 
HTTP 调用其实也是一种特殊的 RPC
HTTP1.0 协议时,HTTP 调用还只能是短链接调用,一个请求来回之后连接就会关闭 。HTTP1.1 在 HTTP1.0 协议的基础上进行了改进,引入了 KeepAlive 特性可以保持 HTTP 连接长时间不断开,以便在同一个连接之上进行多次连续的请求,进一步拉近了 HTTP 和 RPC 之间的距离 。


推荐阅读