web-dev-qa-db-fra.com

En quoi GRPC est-il différent de REST?

Je lis ceci explication de GRPC et ce diagramme est intéressant:

enter image description here

Comment fonctionne la couche de transport? Si c'est sur le réseau ... pourquoi s'appelle-t-il un RPC? Plus important encore, en quoi cela diffère-t-il de REST qui implémente une API pour la couche service (la classe du client qui a des méthodes qui effectuent une demande http)?

84
Jwan622

La couche de transport fonctionne avec HTTP/2 en plus de TCP/IP. Il permet des connexions plus rapides (plus rapides) pouvant tirer parti d'une seule connexion client à serveur (ce qui permet une utilisation plus efficace de la connexion et une utilisation plus efficace des ressources du serveur.

HTTP/2 prend également en charge la connectivité bidirectionnelle et la connectivité asynchrone. Il est donc possible que le serveur établisse un contact efficace avec le client pour envoyer des messages (réponse/notifications asynchrones, etc.)

Alors que REST et gRPC peuvent tous deux générer des stubs client/serveur (en utilisant quelque chose comme swagger pour REST), REST dispose d'un ensemble limité d'appels de 'fonction' primaires (ou de verbes):

 + ----------- + ---------------- + 
 | HTTP Verb | CRUD | 
 + ----------- + ---------------- + 
 | GET | Lire | 
 | PUT | Mettre à jour/remplacer | 
 | PATCH | Mettre à jour/modifier | 
 | SUPPRIMER | Supprimer | 
 + ----------- + ---------------- + 

alors que gRPC vous pouvez définir tout type d’appel de fonction, y compris synchrone/asynchrone, unidirectionnel/bidirectionnel (flux), etc.

En utilisant gRPC, le client appelle une méthode locale. Pour le programmeur, il semble que vous passiez un appel local, mais la couche sous-jacente (le stub client généré automatiquement) envoie l'appel au serveur. Pour le serveur, il semble que sa méthode a été appelée localement.

gRPC prend en charge toute la plomberie sous-jacente et simplifie le paradigme de la programmation. Cependant, pour certains REST puristes, cela peut sembler une complication excessive. YMMV

92
mmccabe

REST ne nécessite pas JSON ou HTTP/1.1

Vous pouvez créer de manière triviale un service RESTful qui envoie des messages protobuf (ou autre) via HTTP/2

Vous pouvez créer des services RESTful qui envoient JSON via HTTP/2

Vous pouvez créer des services RESTful qui envoient des messages protobuf via HTTP/1.1

Les services RESTful ne constituent pas un "hack" au-dessus de HTTP/x.x, ils sont basés sur les principes architecturaux fondamentaux qui ont rendu toute version de HTTP réussie (comme la capacité de cache des requêtes GET et la possibilité de rejouer des requêtes PUT).

gRPC, SOAP, et. al ressemble davantage à des hacks - des hacks au-dessus de HTTP pour canaliser des services de type RPC sur HTTP, afin de contourner les restrictions de pare-feu et de boîtier de médiation. Ce n'est pas nécessairement une mauvaise chose. Parfois, vous voudrez peut-être un service de style RPC au lieu d'un REST et vous devrez vivre dans un monde où les boîtes de médiation sont difficiles à remplacer.

Si vous n'avez pas le temps de lire la définition actuelle de REST: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_Arch_style.htm

Il y a toujours le TLDR; version sur wikipedia:

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

Si vous avez besoin d'un service de style RPC, bien sûr, gRPC est génial. Si vous souhaitez vivre sur le Web ou si vous souhaitez bénéficier de tous les avantages d'un service de style RESTful, créez un service de style RESTful. Et s'il est trop lent de sérialiser/désérialiser les données au format JSON dans votre service reposant, vous pouvez parfaitement utiliser protobuf ou autre.

Si gRPC est une version 2 de quelque chose, c'est une version 2 de SOAP. Un qui n'est pas terrible, comme le savon.

Et, non, vous ne pouvez pas simplement "appeler une fonction" dans votre demande GET et disposer d'un service RESTful.

Une dernière chose: si vous voulez utiliser des protobufs sur un service RESTful, veuillez le faire correctement, en utilisant les en-têtes de type de contenu, etc. Cela vous permet de prendre en charge à la fois JSON ET Protobuf.

Quitter ma SOAP box maintenant ..;)

26
user2077221

Le principal avantage de gRPC sur REST est la prise en charge de HTTP/2 par rapport au grand-père HTTP 1.1. Ensuite, le principal avantage de HTTP/2 par rapport à HTTP 1.1 est le suivant: "HTTP/2 permet au serveur de" transmettre "du contenu" ...

5
Denis Wang