Comment amener un gRPC défini API pour le navigateur web
Nous voulons construire une en Javascript/HTML gui pour notre gRPC-microservices. Depuis gRPC n'est pas pris en charge sur le navigateur côté, nous avons pensé à l'utilisation de web sockets pour se connecter à un node.js serveur, qui appelle le service cible via grpc.
Nous nous efforçons de trouver une solution élégante pour ce faire. En particulier, puisque nous utilisons gRPC flux de pousser des événements entre nos micro-services.
Il semble que nous avons besoin d'un deuxième système RPC, juste pour communiquer entre l'extrémité avant et à l'node.js serveur. Cela semble être beaucoup de frais généraux et de code supplémentaire qui doit être maintenu.
Quelqu'un a une expérience à faire quelque chose comme ça ou a une idée de comment cela pourrait être résolu?
- Découvrez Générique API qui est un petit outil qui vous permet de facilement créer une API RPC entre votre interface et votre Node.js serveur. C'est comme gRPC, mais beaucoup plus simple et beaucoup plus facile à utiliser. Divulgation: je suis l'auteur.
Vous devez vous connecter pour publier un commentaire.
Edit: Depuis Oct 23,2018 la gRPC-projet Web est GA, qui pourrait être le plus officiel/méthode normalisée pour résoudre votre problème. (Même si c'est déjà 2018 maintenant... 😉 )
De la GA-Blog: "gRPC-Web, tout comme gRPC, vous permet de définir le service “contrat” entre le client (web) et backend gRPC services à l'aide de Tampons de Protocole. Le client peut alors être généré automatiquement. [...]"
Nous avons récemment construit gRPC-Web (https://github.com/improbable-eng/grpc-web) - un navigateur client et le serveur wrapper qui suit le projet de gRPC-Web protocole. L'exemple dans ce repo devrait fournir un bon point de départ.
Il nécessite soit un proxy autonome ou un wrapper pour votre gRPC serveur si vous utilisez Golang. Le proxy/wrapper modifie la réponse du forfait pour les remorques dans le corps de la réponse de sorte qu'ils peuvent être lus par le navigateur.
Divulgation: je suis un responsable du projet.
Malheureusement, il n'y a pas de bonne réponse pour vous encore.
Appui streaming Rpc à partir du navigateur entièrement nécessite HTTP2 remorques pour être pris en charge par les navigateurs, et au moment de la rédaction de cette réponse, ils ne sont pas.
Voir ce problème pour la discussion sur le sujet.
Sinon, oui, vous auriez besoin d'un plein système de traduction entre les WebSockets et de gRPC. Peut-être l'inspiration du grpc-passerelle pourrait être le début d'un tel projet, mais c'est encore un très long plan.
Officiel de grpc-web (beta) de la mise en œuvre a été publié sur 3/23/2018. Vous pouvez le trouver à
Les instructions suivantes sont prises dans le README:
Définir votre gRPC service:
Construire le serveur dans la langue que vous voulez.
Créer votre JS client de faire des appels à partir du navigateur:
Faire un unaire appel RPC
Flux de données à partir du serveur vers le navigateur pris en charge:
Bidirectionnel flux ne sont PAS pris en charge:
C'est un travail en cours et sur la grpc-web feuille de route. Bien qu'il existe un exemple protobuf montrant bidi streaming, ce commentaire, il est clair que cet exemple ne fonctionne pas encore.
J'espère que cela va bientôt changer. 🙂
Le grpc personnes à https://github.com/grpc/ sont actuellement à la construction d'un js la mise en œuvre.
La repro est à https://github.com/grpc/grpc-web (donne 404 ->) qui est actuellement (2016-12-20) au début de l'accès, de sorte que vous devez demande d'accès.
https://github.com/tmc/grpc-websocket-proxy sonne comme il peut répondre à vos besoins. Cela se traduit par json sur les web sockets de grpc (couche supérieure de grpc-passerelle).
GRPC Bus WebSocket Proxy est exactement ce que par l'utilisation de proxy tous GRPC des appels via une connexion WebSocket pour vous donner quelque chose qui ressemble beaucoup à du Nœud GRPC de l'API dans le navigateur. Contrairement à la GRPC de la Passerelle, il fonctionne aussi bien en streaming demandes et streaming des réponses, ainsi que la non diffusion des appels.
Il est à la fois un les composants serveur et client.
Le GRPC Bus WebSocket serveur Proxy peut être exécuté avec le Panneau en faisant
docker run gabrielgrant/grpc-bus-websocket-proxy
Côté navigateur, vous devez installer le GRPC Bus WebSocket client du Proxy avec
npm install grpc-bus-websocket-client
et puis créer un nouveau GBC objet avec:
new GBC(<grpc-bus-websocket-proxy address>, <protofile-url>, <service map>)
Par exemple:
La bibliothèque client s'attend à être en mesure de télécharger le
.proto
fichier avec une requête AJAX. Leservice-map
fournit les Url des différents services définis dans votre proto de fichier, tel que vu par le serveur proxy.Pour plus de détails, voir la GRPC Bus WebSocket client Proxy README
Je vois beaucoup de réponses n'a pas de point à la bidirectionnalité de la solution par rapport à WebSocket, comme l'OP demandé pour la prise en charge du navigateur.
Vous pouvez utiliser JSON-RPC au lieu de gRPC, pour obtenir un bidirectionnel RPC sur WebSocket, qui prend en charge un plus grand nombre, y compris WebRTC (navigateur).
Je suppose que cela pourrait être modifié à l'appui de gRPC, si vous avez vraiment besoin de ce type de sérialisation.
Toutefois, pour l'onglet de navigateur à onglet de navigateur, les objets de requête ne sont pas serializsed et sont transférés en mode natif, et la même chose avec NodeJS cluster ou le fil de travailleurs, qui offre beaucoup plus de performance.
Aussi, vous pouvez transférer des "pointeurs" vers SharedArrayBuffer, au lieu de la sérialisation par le gRPC format.
JSON de sérialisation et de désérialisation en V8 est également imbattable.
https://github.com/bigstepinc/jsonrpc-bidirectional
En regardant les solutions actuelles avec gRPC sur le web, voici ce qui est disponible là-bas au moment de la rédaction du présent (et ce que j'ai trouvé):
que la rédaction de ce document, il manque de tests et semble abandonné(edit: regardez les commentaires de l'auteur!)Je veux aussi sans vergogne brancher ma propre solution que j'ai écrit pour mon entreprise et il est utilisé dans la production de demandes de proxy pour un gRPC service qui ne comprend unaire et serveur de streaming appels:
Chaque pouce du code est couvert par des tests. C'est un Express middleware donc il n'a pas besoin d'apporter des modifications supplémentaires à votre gRPC de l'installation. Vous pouvez également déléguer l'authentification HTTP pour Exprimer (e.g avec Passeport).