Wie unterscheidet sich GRPC von REST?


98

Ich lese diese Erklärung von GRPC und dieses Diagramm ist von Interesse:

Geben Sie hier die Bildbeschreibung ein

Wie funktioniert die Transportschicht? Wenn es über das Netzwerk ist ... warum wird es als RPC bezeichnet? Noch wichtiger ist, wie unterscheidet sich dies von REST, das eine API für die Service-Schicht implementiert (die Klasse im Client, die Methoden hat, die eine http-Anfrage stellen)?


20
«Wenn es über das Netzwerk ist ... warum wird es als RPC bezeichnet» - Weil RPC ein Remote Procedure Call ist und 'remote' völlig 'auf einem anderen Host' bedeuten kann.
Weirdan

Antworten:


104

Die Transportschicht arbeitet mit HTTP / 2 über TCP / IP. Es ermöglicht Verbindungen mit geringerer Latenz (schneller), die eine einzelne Verbindung von Client zu Server nutzen können (wodurch die Verbindung effizienter genutzt wird und die Serverressourcen effizienter genutzt werden können.

HTTP / 2 unterstützt auch bidirektionale Konnektivität und asynchrone Konnektivität. Auf diese Weise kann der Server effizient Kontakt mit dem Client aufnehmen, um Nachrichten zu senden (asynchrone Antwort / Benachrichtigungen usw.)

Während sowohl REST als auch gRPC Client / Server-Stubs generieren können (unter Verwendung von Swagger für REST), verfügt REST über eine begrenzte Anzahl von primären Funktionsaufrufen (oder Verben):

+ ----------- + ---------------- +
| HTTP Verb | CRUD |
+ ----------- + ---------------- +
| GET | Lesen |
| PUT | Aktualisieren / Ersetzen |
| PATCH | Aktualisieren / Ändern |
| LÖSCHEN | Löschen |
+ ----------- + ---------------- +

Während gRPC Sie jede Art von Funktionsaufrufen definieren können, einschließlich synchron / asynchron, unidirektional / bidirektional (Streams) usw.

Mit gRPC ruft der Client eine lokale Methode auf. Für den Programmierer sieht es so aus, als würden Sie einen lokalen Anruf tätigen, aber die zugrunde liegende Schicht (der automatisch generierte Client-Stub) sendet den Anruf an den Server. Für den Server sieht es so aus, als ob seine Methode lokal aufgerufen wurde.

gRPC kümmert sich um alle zugrunde liegenden Installationen und vereinfacht das Programmierparadigma. Für einige engagierte REST-Puristen scheint dies jedoch eine Überkomplikation zu sein. YMMV


2
Also, kurze Frage: In REST können Sie auch jede Art von Funktion aufrufen. In Rails kann ich beispielsweise eine GET-Anforderung an einen Endpunkt senden, der nicht REST-fähig ist, und etwas anderes tun, als nur eine Ressource abzurufen. Ich kann wirklich jede Funktion von diesem nicht-RESTful-Endpunkt aus starten. Ich kann auch Dienste in REST erstellen, die anscheinend eine lokale Methode aufrufen, aber wirklich unter der Haube einen http-Aufruf an einen Endpunkt ausführen. Die Unterschiede sind also nicht so groß, zumindest auf der Transportschicht. Oder sind Sie?
Jwan622

2
REST / RESTful läuft über HTTP, gRPC läuft über HTTP / 2 (wie ein WebSocket). Mit einem Codegenerator von Swagger können Client- und Server-Stubs für REST generiert werden. GRPC verwendet eine Protodatei, um die Stubs zu generieren (ähnlich wie beim alten WSDL / SOAP-Ansatz). Die Protodatei definiert den Typ, sodass die generierten Client / Server-Stubs typsicher sind. Auf einem mobilen Gerät ist die gRPC-Verbindung effizient, da sie denselben zugrunde liegenden HTTP / 2-Socket mit allen anderen gleichzeitigen Verbindungen der mobilen App gemeinsam nutzen kann.
mmccabe

Hier ist eine nette Einführung in gRPC: medium.com/square-corner-blog/grpc-reaches-1-0-85728518393b Hier ist eine Demo von gRPC: github.com/mmcc007/go
mmccabe

1
Jwan622 und mmccabe: Mit der Superglue 2.1-Bibliothek kann ich ein Haus mit Äpfeln und Orangen bauen. Irgendwann müssen wir das richtige Werkzeug für den Job auswählen und immer versuchen, die Komplexität unseres Softwaresystems zu minimieren. Denken Sie daran, das Entfernen von Code ist immer eine Leistungsoptimierung;)
Martin Andersson

4
Aus meiner Sicht waren Dinge wie RESTful APIs schon immer ein "Hack", um auf alten Protokollen mitzumachen. Wenn sich etwas ergibt, das es mir ermöglicht, einen Stapel zu verwenden, der besser für moderne Sprachen geeignet ist, und dennoch unabhängig davon ist, welche Sprache speziell von einem Kunden verwendet wird, UND die Leistung dramatisch zu steigern, werde ich die erste Person sein, die auf den Zug springt!
Martin Andersson

42

Für REST ist weder JSON noch HTTP / 1.1 erforderlich

Sie können trivial einen RESTful-Dienst erstellen, der Protobuf-Nachrichten (oder was auch immer) über HTTP / 2 sendet

Sie können RESTful-Services erstellen, die JSON über HTTP / 2 senden

Sie können RESTful-Services erstellen, die Protobuf-Nachrichten über HTTP / 1.1 senden

RESTful-Services sind kein "Hack" über HTTP / xx, sondern Services, die den grundlegenden Architekturprinzipien folgen, die jede Version von HTTP erfolgreich gemacht haben (wie die Cachefähigkeit von GET-Anforderungen und die Wiederspielbarkeit von PUT-Anforderungen).

gRPC, SOAP et al. Alle sind eher wie Hacks - Hacks über HTTP, um RPC-ähnliche Dienste über HTTP zu tunneln, um Firewall- und Middlebox-Einschränkungen zu umgehen. Das ist nicht unbedingt eine schlechte Sache. Manchmal möchten Sie vielleicht einen RPC-ähnlichen Dienst anstelle eines REST-Dienstes, und wir müssen in einer Welt leben, in der Middleboxen schwer zu ersetzen sind.

Wenn Sie keine Zeit haben, sich über die tatsächliche Definition von REST zu informieren: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

Es gibt immer die TLDR; Version auf Wikipedia:

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

Wenn Sie einen Service im RPC-Stil benötigen, ist gRPC sicher großartig. Wenn Sie im Web leben möchten oder alle Vorteile eines RESTful-Style-Service nutzen möchten, erstellen Sie einen RESTful-Style-Service. Und wenn es zu langsam ist, Daten im JSON-Format in Ihrem erholsamen Service zu serialisieren / zu deserialisieren, ist es vollkommen in Ordnung, Protobuf oder was auch immer zu verwenden.

Wenn gRPC eine Version 2 von irgendetwas ist, ist es eine Version 2 von SOAP. Eine, die nicht schrecklich ist, wie SOAP.

Und nein, Sie können in Ihrer GET-Anfrage nicht einfach "irgendeine Funktion aufrufen" und haben einen RESTful-Service.

Eine letzte Sache: Wenn Sie Protobufs über einen RESTful-Service verwenden möchten, machen Sie es bitte richtig, indem Sie die Header des Inhaltstyps usw. verwenden. Damit können Sie sowohl JSON als auch Protobuf problemlos unterstützen.

Tritt jetzt von meiner SOAP-Box zurück ..;)


Bedeuten Sie, dass mit gRPC kein RESTful-Service erstellt werden kann?
Kevin S

1
Das RTFM, in dem die Dissertation von Fielding zitiert wurde, war übertrieben, aber ansonsten eine große Resonanz.
rmharrison

4

Der größte Vorteil von gRPC gegenüber REST ist die Unterstützung von HTTP / 2 gegenüber Opa HTTP 1.1. Dann ist der größte Vorteil von HTTP / 2 gegenüber HTTP 1.1: "HTTP / 2 ermöglicht es dem Server, Inhalte zu" pushen "...


1
Server Push benötigt kein HTTP / 2.
Robin Green

Könnten Sie genauer sein? Dies ist das Wiki über HTTP / 2 Server Push: en.wikipedia.org/wiki/HTTP/2_Server_Push
Denis Wang

2
Entschuldigung, ich meinte nicht HTTP 2 Server Push, sondern Streaming Antworten. Es gibt andere Möglichkeiten, Streaming-Antworten zu erstellen, z. B. die ehrwürdige lange Abfrage oder Websockets.
Robin Green

1
Der gRPC-Server sendet keinen HTTP / 2-Push und der gRPC-Client ignoriert den HTTP / 2-Push. Daher sollten die von HTTP / 2 geerbten Vorteile von gRPC nicht den Push beinhalten.
user675693
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.