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


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

文章插图
 
当 HTTP 协议进化到 2.0 之后,Google 开源了一个建立在 HTTP2.0 协议之上的通信框架直接取名为 gRPC,也就是 Google RPC,这时 HTTP 和 RPC 之间已经没有非常明显的界限了 。所以在后文我们不再明确强调 RPC 和 HTTP 请求调用之间的细微区别了,直接统一称之为 RPC 。
最通俗的语言讲清楚RPC和HTTP

文章插图
 
HTTP VS RPC (普通话 VS 方言)
HTTP 与 RPC 的关系就好比普通话与方言的关系 。要进行跨企业服务调用时,往往都是通过 HTTP API,也就是普通话,虽然效率不高,但是通用,没有太多沟通的学习成本 。但是在企业内部还是 RPC 更加高效,同一个企业公用一套方言进行高效率的交流,要比通用的 HTTP 协议来交流更加节省资源 。整个中国有非常多的方言,正如有很多的企业内部服务各有自己的一套交互协议一样 。虽然国家一直在提倡使用普通话交流,但是这么多年过去了,你回一趟家乡探个亲什么的就会发现身边的人还是流行说方言 。
如果再深入一点说,普通话本质上也是一种方言,只不过它是官方的方言,使用最为广泛的方言,相比而言其它方言都是小语种,小语种之中也会有几个使用比较广泛比较特色的方言占比也会比较大 。这就好比开源 RPC 协议中 Protobuf 和 Thrift 一样,它们两应该是 RPC 协议中使用最为广泛的两个 。
RPC 与分布式系统交互方案
如果两个子系统没有在网络上进行分离,而是运行在同一个操作系统实例之上的两个进程时,它们之间的通信手段还可以更加丰富 。除了以上提到的几种分布式解决方案之外,还有共享内存、信号量、文件系统、内核消息队列、管道等,本质上都是通过操作系统内核机制来进行数据和消息的交互而无须经过网络协议栈 。
但在现代企业服务中,这种单机应用已经非常少见了,因为单机应用意味着单点故障 —— “一人摔跤全家跌倒” 。业务子系统往往都需要经物理网络栈进行隔离,因此分布式解决方案在要求高可用无间断服务的企业环境里便大有作为,这也让 RPC 迎来自己大放异彩的时代 。
前文提到的分布式子系统交互方案,除了 RPC 技术之外还有数据库、消息队列和缓存 。但其实这三者本质上是 RPC 技术的一个应用组合 。我们可以将数据库服务理解为下面这张图:
最通俗的语言讲清楚RPC和HTTP

文章插图
 
可以看出,子系统和数据库之间的交互也是通过 RPC 进行的,只不过这里是三个子系统之间复杂的组合消息交互罢了 。如果再深入进去,你会发现,这里的数据库不是那种单机数据库,而是具备主从复制功能的数据库,比如 MySQL 。在互联网企业里一般都会使用这种主从读写分离的数据库 。一个业务子系统将数据写往主库,主库再将数据同步到从库,然后另一个业务子系统又从库里将数据取出来 。这时又可以进一步将它们看成是四个子系统之间进行的更加复杂的 RPC 数据交互 。
最通俗的语言讲清楚RPC和HTTP

文章插图

 

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


推荐阅读