GRPC 与 REST 有何不同?

How is GRPC different from REST?

我正在读这个 explanation of GRPC 并且这张图表很有趣:

传输层是如何工作的?如果它是通过网络...为什么它被称为 RPC?更重要的是,这与为服务层实现 API 的 REST 有何不同(客户端中的 class 具有发出 http 请求的方法)?

传输层在 TCP/IP 之上使用 HTTP/2 工作。它允许更低延迟(更快)的连接,可以利用从客户端到服务器的单个连接(这可以更有效地使用连接并可以更有效地使用服务器资源。

HTTP/2还支持双向连接和异步连接。因此服务器可以有效地与客户端联系以发送消息(异步response/notifications,等等)

虽然 REST 和 gRPC 都可以生成 client/server 存根(对 REST 使用类似 swagger 的东西),但 REST 有一组有限的主要 'function' 调用(或动词):

+-----------+----------------+
| HTTP Verb |      CRUD      |
+-----------+----------------+
| POST      | Create         |
| GET       | Read           |
| PUT       | Update/Replace |
| PATCH     | Update/Modify  |
| DELETE    | Delete         |
+-----------+----------------+

而 gRPC 您可以定义任何类型的函数调用,包括 synchronous/asynchronous、uni-direction/bidirectional(streams) 等。

客户端使用 gRPC 调用本地方法。对于程序员来说,看起来您正在进行本地调用,但是底层(自动生成的客户端存根)将调用发送到服务器。对于服务器来说,它的方法似乎是在本地调用的。

gRPC 负责所有底层管道并简化编程范例。然而,对于一些专注的 REST 纯粹主义者来说,这似乎过于复杂了。 YMMV

gRPC 相对于 REST 的最大优势是它支持 HTTP/2 而不是 HTTP 1.1。那么 HTTP/2 相对于 HTTP 1.1 的最大优势是,'HTTP/2 allows the server to "push" content'...

REST 不需要 JSON 或 HTTP/1.1

您可以轻松构建一个 RESTful 服务,通过 HTTP/2

发送 protobuf 消息(或其他)

您可以构建 RESTful 服务,通过 HTTP/2

发送 JSON

您可以构建 RESTful 服务,通过 HTTP/1.1

发送 protobuf 消息

RESTful 服务不是 HTTP/x.x 之上的 "hack",它们是遵循使任何版本的 HTTP 都成功的基本架构原则的服务(例如缓存能力GET 请求的数量和 PUT 请求的可重播性)。

gRPC、SOAP 等。 al 更像是 hacks - 在 HTTP 之上的 hacks 通过 HTTP 隧道 RPC-style 服务,绕过防火墙和中间件限制。这不一定是坏事。有时您可能需要 RPC-style 服务而不是 REST 服务,而我们必须生活在一个中间件难以替代的世界中。

如果您没有时间阅读 REST 的实际定义: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

总是有 TLDR;维基百科上的版本:

https://en.wikipedia.org/wiki/Representational_state_transfer

如果您需要 RPC-style 服务,当然,gRPC 很棒。如果您想在网络上生活,或者想要享受 RESTful 风格服务带来的所有好处,那么请构建一个 RESTful 风格服务。如果在 restful 服务中 serialize/deserialize 格式的 JSON 数据太慢,那么使用 protobuf 或其他任何东西都可以。

如果 gRPC 是任何东西的第 2 版,那么它就是 SOAP 的第 2 版。一个不可怕的,比如 SOAP。

而且,不,您不能只在 GET 请求中 "call any function",并拥有 RESTful 服务。

最后一件事:如果您要在 RESTful 服务上使用 protobufs,请正确使用内容类型 headers 等。有了它,您可以轻松地支持两者 JSON 和 protobuf.

现在从我的 SOAP 盒子里走下来.. ;)

总觉得gRPC和REST绝对是两个不同的东西

REST 最适合面向资源的服务。 否则我们可以使用 gRPC 来获得高性能。

REST 是 Internet 级别,供最终用户与我们的服务对话。 gRPC 是 Intranet 级别的,用于内部服务之间的相互通信。

REST 具有可遵循的应用程序语义。 gRPC 未提供任何内容,您应该从头开始构建所有内容。