GRPC与REST有何不同?


98

我正在阅读有关GRPC的解释,此图很有趣:

在此处输入图片说明

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


20
«如果是通过网络...为什么将其称为RPC»—因为RPC是远程过程调用,所以“远程”可以完全表示“在另一台主机上”。
weirdan

Answers:


104

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

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

尽管REST和gRPC都可以生成客户端/服务器存根(使用诸如svagger这样的REST),但是REST具有有限的一组主要“函数”调用(或动词):

+ ----------- + ---------------- +
| HTTP动词| CRUD |
+ ----------- + ---------------- +
| GET | 阅读|
| 放置| 更新/替换|
| 补丁| 更新/修改|
| 删除 删除|
+ ----------- + ---------------- +

而gRPC您可以定义任何类型的函数调用,包括同步/异步,单向/双向(流)等。

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

gRPC负责所有底层的管道,并简化了编程范例。但是,对于一些敬业的REST纯粹主义者,这似乎过于复杂。青年汽车


2
因此,一个简单的问题:在REST中,您还可以调用任何一种函数。例如,在Rails中,我可以将GET请求发送到非RESTful的端点,并且除了获取资源外还可以执行其他操作。我可以从该非RESTful终结点实现任何功能。我还可以在REST中创建服务,这些服务似乎正在调用本地方法,但实际上是在对端点进行http调用。因此,差异并不是很大……至少在传输层上。还是他们?
Jwan622 '17

2
REST / RESTful通过HTTP运行,gRPC通过HTTP / 2(例如WebSocket)运行。使用Swagger的代码生成器,可以生成REST的客户端和服务器存根,gRPC使用原型文件来生成它的存根(与旧的WSDL / SOAP方法不同)。原始文件定义类型,因此生成的客户端/服务器存根是类型安全的。在移动设备上,gRPC连接非常有效,因为它可以与移动应用程序中的任何其他并发连接共享相同的基础HTTP / 2套接字。
mmccabe'5


1
Jwan622和mmccabe:使用Superglue 2.1库,我可以用苹果和橙子盖房子。在某些时候,我们必须选择合适的工具来完成工作,并始终寻求将软件系统的复杂性降至最低。请记住,删除代码始终是性能优化;)
Martin Andersson

4
从我的角度来看,诸如RESTful API之类的东西一直是沿用旧协议的“黑客”。如果出现某种情况,使我可以使用更适合现代语言的堆栈,并且仍然对客户端使用的是哪种语言不了解,并且可以显着提高性能,那么我将成为第一个加入潮流的人!
Martin Andersson

42

REST不需要JSON或HTTP / 1.1

您可以轻松构建一个通过HTTP / 2发送protobuf消息(或其他任何消息)的RESTful服务

您可以构建通过HTTP / 2发送JSON的RESTful服务

您可以构建RESTful服务,以通过HTTP / 1.1发送protobuf消息

RESTful服务不是HTTP / xx之上的“黑客”,它们是遵循基本体系结构原理的服务,这些原理已使任何版本的HTTP成功(例如GET请求的可缓存性和PUT请求的可重播性)。

gRPC,SOAP等。Al更像是骇客-HTTP之上的骇客通过HTTP隧道传送RPC样式的服务,从而绕过防火墙和中间盒限制。那不一定是坏事。有时,您可能希望使用RPC样式的服务而不是REST服务,而我们必须生活在一个很难替换中间箱的世界中。

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

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

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

如果您需要RPC样式的服务,那么gRPC很好。如果您想生活在Web上,或者想要RESTful样式服务附带的所有好处,请构建RESTful样式服务。而且,如果在您的静态服务中以JSON格式对数据进行序列化/反序列化太慢,则可以使用protobuf或其他任何方法。

如果gRPC是任何东西的版本2,那么它就是SOAP的版本2。一种不可怕的东西,例如SOAP。

而且,不,您不能只是在GET请求中“调用任何函数”,而拥有RESTful服务。

最后一件事:如果要在RESTful服务上使用protobuf,请使用内容类型标头等正确执行操作。这样,您就可以轻松支持JSON和protobuf。

现在从我的SOAP框退出。.;)


您是否暗示无法使用gRPC创建RESTful服务?
凯文S

1
RTFM引用了菲尔丁的论文是过大的,但是在其他方面反应却很好。
rmharrison

4

与REST相比,gRPC的最大优点是其对HTTP / 2的支持超过了HTTP 1.1。那么HTTP / 2相对于HTTP 1.1的最大优势是,“ HTTP / 2允许服务器“推送”内容” ...


1
服务器推送不需要HTTP / 2。
罗宾·格林

你可以再详细一点吗?这是谈论HTTP / 2服务器推送的Wiki:en.wikipedia.org/wiki/HTTP/2_Server_Push
Denis Wang

2
抱歉,我不是指HTTP 2服务器推送,而是指流式答复。还有其他执行流式答复的方法,例如,古老的长轮询或websocket。
罗宾·格林

1
gRPC服务器不会发送HTTP / 2“推送”,而gRPC客户端会忽略HTTP / 2“推送”。因此,从HTTP / 2继承的gRPC的优势不应包括“推送”
。– user675693
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.