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 未提供任何内容,您应该从头开始构建所有内容。
我正在读这个 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 未提供任何内容,您应该从头开始构建所有内容。