wake-up-neo.com

Inwiefern unterscheidet sich GRPC von REST?

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

enter image description here

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

84
Jwan622

Die Transportschicht arbeitet mit HTTP/2 über TCP/IP. Es ermöglicht (schnellere) Verbindungen mit geringerer Latenz, die die Vorteile einer einzelnen Verbindung vom Client zum Server nutzen können (wodurch die Verbindung effizienter genutzt 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 (mit etwas wie swagger für REST), hat REST= eine begrenzte Anzahl von primären 'Funktions'-Aufrufen (oder Verben):

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

mit gRPC können Sie alle Arten von Funktionsaufrufen definieren, 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 Ebene (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 die gesamte Installation und vereinfacht das Programmierparadigma. Für einige engagierte REST Puristen scheint dies jedoch eine Überkomplikation zu sein. YMMV

92
mmccabe

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

Sie können ganz einfach 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-Dienste erstellen, die Protobuf-Nachrichten über HTTP/1.1 senden

RESTful-Services sind kein "Hack" über HTTP/x.x, sondern Services, die den grundlegenden Architekturprinzipien folgen, die eine HTTP-Version erfolgreich gemacht haben (wie die Cachebilität von GET-Anforderungen und die Wiederholbarkeit von PUT-Anforderungen).

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

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

Es gibt immer das TLDR; Version auf Wikipedia:

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

Wenn Sie einen Service im RPC-Stil benötigen, ist gRPC natürlich großartig. Wenn Sie im Internet 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, können Sie protobuf oder was auch immer 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, 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.

Von meiner SOAP Box runtersteigen ..;)

26
user2077221

Der größte Vorteil von gRPC gegenüber REST ist die Unterstützung von HTTP/2 gegenüber dem Großvater HTTP 1.1. Der größte Vorteil von HTTP/2 gegenüber HTTP 1.1 ist, dass HTTP/2 dies dem Server ermöglicht Inhalt "pushen" ...

5
Denis Wang