RPC 调用和 HTTP 调用的区别

0. OSI网络七层模型

在说RPC和HTTP的区别之前,我觉的有必要了解一下OSI的七层网络结构模型。

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

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

HTTP是应用层协议。
TCP是传输层协议。

 

1. 什么是RPC

RPC需要从三个角度来介绍RPC:

  • RPC架构
  • 同步异步调用
  • 流行的RPC框架
RPC架构

先说说RPC服务的基本架构吧,见下图:


RPC架构

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

  • 客户端(Client)
    服务的调用方。

  • 服务端(Server)
    真正的服务提供者。

  • 客户端存根(Client Stub)
    存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。

  • 服务端存根(Server Stub)
    接收客户端发送过来的消息,将消息解包,并调用本地的方法。

同步调用与异步调用

什么是同步调用?什么是异步调用?
同步调用就是客户端等待调用执行完成并返回结果。
异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果的通知。如果客户端并不关心结果,则可以变成一个单向的调用。
这个过程有点类似于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框架方便开发。
    可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。

 

2. HTTP服务

大部分企业开发的模式一直为HTTP接口开发,也就是我们常说的RESTful风格的服务接口。
的确,对于在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;
优点就是简单、直接、开发方便。
利用现成的http协议进行传输。
比如下面这个例子:
POST http://www.httpexample.com/restful/buyer/info/shar
接口可能返回一个JSON字符串或者是XML文档。然后客户端再去处理这个返回的信息,从而可以比较快速地进行开发。

对于大型企业来说,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了

  • 首先就是长连接
    不必每次通信都要像http一样去3次握手什么的,减少了网络开销。

  • 其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等
    对调用方来说是无感知、统一化的操作。

 

3. 总结

RPC服务和HTTP服务还是存在很多的不同点的。
一般来说,RPC服务主要是针对大型企业的
HTTP服务主要是针对小企业的,因为RPC效率更高,而HTTP服务开发迭代会更快。

总之,选用什么样的框架不是按照市场上流行什么而决定的,而是要对整个项目进行完整地评估,
从而在仔细比较两种开发框架对于整个项目的影响,最后再决定什么才是最适合这个项目的。
一定不要为了使用RPC而每个项目都用RPC,而是要因地制宜,具体情况具体分析。

你可能感兴趣的:(RPC 调用和 HTTP 调用的区别)