Skip to content

HTTP调用与RPC调用的关系

📌 很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么,因此写此文用于我自身梳理和学习二者具体的区别。

先说一下二者最本质的区别

  • RPC主要是基于TCP/IP协议
  • HTTP服务主要是基于HTTP协议

HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC是要更胜一筹

OSI网络七层模型

在说RPC和HTTP的区别之前,可以先了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层:(从上到下)

  • 第一层:应用层。定义了用于在网络中进行通信和传输数据的接口;
  • 第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
  • 第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
  • 第四层:传输层。管理着网络中的端到端的数据传输;
  • 第五层:网络层。定义网络设备间如何传输数据;
  • 第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
  • 第七层:物理层。这一层主要就是传输这些二进制数据。

实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。我们应该将重点放在应用层和传输层这两个层面。因为HTTP是应用层协议,而TCP是传输层协议

RPC服务

RPC服务(远程过程调用服务)是一种允许一个网络的一端影响另一端的程序的通信方法。RPC采用请求-响应模式:请求者发送请求到提供服务的程序,然后挂起自己的处理进程,等待响应。在响应者处理完请求并发送回响应后,请求者恢复处理进程。在此过程中,请求者和响应者可能分别位于不同的设备上。由于RPC服务是基于TCP/IP协议的,因此相比HTTP服务,其在效率上有一定优势,然而,这种效率优势需要权衡其较弱的兼容性和通用性,RPC服务更适合在具有强大内部控制的系统中使用,而HTTP服务更适合在开放性的系统中使用。

RPC架构

一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件:

  • 客户端(Client): 服务的调用方
  • 服务端(Server):服务的提供者
  • 客户端存根(Client Stub):存放服务端的地址信息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方
  • 服务端存根(Server Stub):接收客户端发送过来的消息,将消息解包,并调用本地的方法

Untitled

同步调用与异步调用

同步调用就是客户端等待调用执行完成并返回结果。异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果的通知。如果客户端并不关心结果,则可以变成一个单向的调用。

这个过程有点类似于Java中的callable和runnable接口,我们进行异步执行的时候,如果需要知道执行的结果,就可以使用callable接口,并且可以通过Future类获取到异步执行的结果信息。如果不关心执行的结果,直接使用runnable接口就可以了,因为它不返回结果,当然啦,callable也是可以的,我们不去获取Future就可以了

流行的RPC框架

目前流行的开源RPC框架还是比较多的。下面重点介绍三种:

  • gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持。这个RPC框架是基于HTTP协议实现的,底层使用到了Netty框架的支持。
  • Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的IDL定义文件自动生成服务代码框架。用户只要在其之前进行二次开发就行,对于底层的RPC通讯等都是透明的。不过这个对于用户来说的话需要学习特定领域语言这个特性,还是有一定成本的。
  • Dubbo是阿里集团开源的一个极为出名的RPC框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。同样 的远程接口是基于Java Interface,并且依托于spring框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。

HTTP服务

相较于RPC,HTTP服务是基于HTTP协议的。HTTP是应用层协议,主要解决了如何在网络上传输超文本数据。HTTP服务采取请求-响应模式,客户端向服务端发送请求,服务端处理请求后返回响应。一个显著的特点是无状态性,每个请求都是独立的,不依赖于之前或之后的请求。

尽管HTTP服务在效率上可能不如基于TCP/IP协议的RPC服务,但其在兼容性和通用性方面有优势。HTTP协议是互联网的基本协议,几乎所有的网络设备都支持,因此HTTP服务在开放性的系统中更受欢迎。

其实在很久以前,我对于企业开发的模式一直定性为HTTP接口开发,也就是我们常说的RESTful风格的服务接口,对于在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。

  • 接口可能返回一个JSON字符串或者是XML文档。然后客户端再去处理这个返回的信息,从而可以比较快速地进行开发。

结论

总的来说,RPC服务和HTTP服务各有优势,选择哪种服务取决于具体的应用场景。如果需要高效率的内部通信,RPC服务可能是更好的选择。然而,如果系统需要与外部设备进行广泛的通信,或者需要更好的兼容性和通用性,那么HTTP服务可能是更好的选择。

最后更新于: