Overview
REST 是一种构建在 HTTP/1 之上的架构风格,而 GRPC 不是一种架构风格而是一个构建在 HTTP/2 之上的 RPC 框架,并且底层使用了 protocol buffer 这种高效的二进制序列化协议。因此可以说 GRPC 是一个实际的实现,或者你可以说它是一个库,而 REST 只是一组规则和原则。
我们将 GRPC(框架)和 REST(架构风格和规则)比较可能比较奇怪,但是从高级架构设计方面了解它们的差异是非常重要的,如果你使用其中一种而不是另一种, 尽管我们正在比较 GRPC(实现的框架)和REST-(架构风格和原则),这听起来可能很奇怪。尽管如此,了解高级架构方面的差异是很重要的,它们的主要区别如下所述。
Links
GRPC
REST
Protocol
- GRPC 是一个 RPC 框架,构建在 HTTP/2 之上
- HTTP/2 保留了 HTTP/1.1 的所有语义,因此,即使使用 HTTP/2,REST 应用程序接口也能继续工作(兼容 v1)
Nature
- GRPC 的思维方式是面向 API 的或面向操作的。
- REST 是面向资源的。
Mode of Data Transfer
- GRPC 仅支持使用 Protocol Buffers 在服务器和客户端之间传输数据
- REST 支持 JSON、XML 和其他数据格式,REST 也可以使用 Protocol Buffer
Model
-
GRPC 提供了四种不同的客户端和服务器之间的通信方式。四种不同的方式是一元(unary,单向)、服务器流、客户端流和双向流。因此,在 GRPC 中,客户端和服务器都可以有效地相互通信。
- Unary:这是最简单的一种通信方式,客户端发送请求,服务器发送响应
- Client streaming:客户端可以发送多个信息流,而服务器只需对所有客户端请求返回一个响应。
- Server Streaming:客户端将只发送一条消息,而服务器可以向其发送一个消息流。
- Bi-directional streaming:客户端和服务器都可以流式传输多条信息。信息流是并行且不要求顺序的。同时,它也是非阻塞的,客户端和服务器在发送下一条信息前都不需要等待响应。
-
REST 采用请求-响应模型。基本上就是你向服务器发送请求,然后得到响应。因此,REST 只提供了一种一元通信方式。在 REST 中,只有客户端与服务器通信。
Performance
由于 GRPC 本身使用 HTTP/2,所以所有应用于 HTTP/2 的性能优化都可以在 GRPC 中自动获得。
HTTP/2在 HTTP/1上引入了一些性能优化,例如
- 头部压缩
- 多路复用(基于 stream)
- 双向流传输(支持服务器推送)
- etc
另外,GRPC 内部使用协议缓冲区,由于协议缓冲区是二进制数据,大小较小(使用变长编码,将空间利用到了极致),因此在网络上传输速度很快。由于这两个原因,GRPC 的速度非常快。
- 通过 HTTP/1 传输的 REST 会比 GRPC 慢。它使用 JSON、XML 来表示相同的数据,比协议缓冲区占用更大的空间。
Code Generation
- 由于 GRPC 建立在协议缓冲区之上,因此可以自动生成代码。事实上,有了协议缓冲区,代码生成是使用 GRPC 的必备条件。(比如 go 的 grpc 代码生成插件,在编写好 proto 文件后就可以通过代码生成库和插件快速生成对应的 go 代码)
- REST 还提供了通过 Swagger 和 OPEN API 生成代码的功能,但这只是额外提供的功能,并不如通过协议缓冲生成代码那么有效
Type Safety
-
在 GRPC 中,协议缓冲区用于代码生成,从而在某种程度上为 GRPC 提供了类型安全的能力。GRPC 不允许你为需要字符串类型的字段发送 int 类型的数据,因为 API 约定是由 proto文件严格定义的。
-
REST 则没有这样的限制,API 约定大多只是一份使用 OPEN API 或 swagger 的文档,因此它的定义是松散的。
SetUP
- GRPC 需要在本地设置一个客户端才能进行 GRPC 调用(即我们常说的 client stub,一般通过服务发现获取一个与 GRPC 服务器已经建立好连接的通道)
- REST 调用不需要设置客户端,可以使用浏览器、postman、curl 等进行调用(debug 优势)
When To Use
-
GRPC 主要适用于需要低延迟和高吞吐量的内部微服务(比如目前采用微服务框架的 bytedance、alibaba、tencent、didi、bilibili 等)。由于目前还没有可供外部服务集成的应用程序接口,因此目前还不适合将你自己开发的 GRPC 服务公开,相信在不久的将来,当 GRPC 得到全面发展时,这会成为可能。
-
REST 则更适合将 API 公开给外部服务。
Conclusion
以上就是 GRPC 和 REST 之间的一些主要区别。