2016-01-28 16 views
44

Wir wollen ein JavaScript/HTML GUI für unsere gRPC-Microservices erstellen. Da gRPC auf der Seite des Browsers nicht unterstützt wird, haben wir uns überlegt, über Web-Sockets eine Verbindung zu einem node.js-Server herzustellen, der den Zieldienst über grpc aufruft. Wir haben Mühe, eine elegante Lösung dafür zu finden. Vor allem, da wir gRPC-Streams verwenden, um Ereignisse zwischen unseren Micro-Services zu pushen. Es scheint, dass wir ein zweites RPC-System brauchen, nur um zwischen dem Frontend und dem node.js Server zu kommunizieren. Dies scheint eine Menge Overhead und zusätzlichen Code zu sein, der beibehalten werden muss.Wie man eine gRPC definierte API in den Webbrowser bringt

Hat jemand Erfahrung mit so etwas oder hat er eine Idee, wie das gelöst werden könnte?

Antwort

15

Leider gibt es noch keine gute Antwort für Sie.

Die Unterstützung von Streaming-RPCs aus dem Browser erfordert vollständig HTTP2-Trailer, die von den Browsern unterstützt werden. Zum Zeitpunkt der Erstellung dieser Antwort sind dies jedoch nicht.

Siehe this issue für die Diskussion über das Thema.

Andernfalls würden Sie ein vollständiges Übersetzungssystem zwischen WebSockets und gRPC benötigen. Vielleicht könnte die Inspiration von grpc-gateway der Beginn eines solchen Projekts sein, aber das ist immer noch eine sehr lange Sicht.

+0

Danke für Ihre Antwort! Ich habe bereits über das Problem mit den http-Trailern gelesen. Es gibt sogar einen Patch, den jemand gemacht hat, so dass es möglich ist, grpc im Browser ohne die Streaming-Funktion zu verwenden. Das Grpc-Gateway-Projekt ist ein nützlicher Hinweis. Wir machen jetzt wahrscheinlich ein Gateway mit dnode ... – Oliver

+1

Ja, wenn du Streaming vergessen hast, dann ist Grpc aus dem Browser durchaus möglich. –

+0

@NicolasNoble - das ist großartig. Gibt es ein Beispiel für einen nicht streaming gRPC-Aufruf von einem Browser? –

1

GRPC-Bus WebSocket-Proxy führt genau das durch, indem alle GRPC-Aufrufe über eine WebSocket-Verbindung weitergeleitet werden, um Ihnen etwas zu geben, das der Node-GRPC-API im Browser sehr ähnlich ist. Im Gegensatz zu GRPC-Gateway funktioniert es sowohl mit Streaming-Anfragen und Streaming-Antworten, als auch ohne Streaming-Anrufe.

Es gibt sowohl eine Server- als auch eine Client-Komponente. Die GRPC Bus WebSocket Proxy server kann, indem Sie docker run gabrielgrant/grpc-bus-websocket-proxy

Auf der Browser-Seite mit Docker ausgeführt wird, müssen Sie die GRPC Bus WebSocket Proxy client mit npm install grpc-bus-websocket-client

installieren und dann mit einem neuen GBC-Objekt erstellen: new GBC(<grpc-bus-websocket-proxy address>, <protofile-url>, <service map>)

Zum Beispiel :

var GBC = require("grpc-bus-websocket-client"); 

new GBC("ws://localhost:8080/", 'helloworld.proto', {helloworld: {Greeter: 'localhost:50051'}}) 
    .connect() 
    .then(function(gbc) { 
    gbc.services.helloworld.Greeter.sayHello({name: 'Gabriel'}, function(err, res){ 
     console.log(res); 
    }); // --> Hello Gabriel 
    }); 

die Clientbibliothek erwartet, dass die .proto Datei mit einem herunterladen zu können, AJAX-Anfrage. Die service-map enthält die URLs der verschiedenen Dienste, die in Ihrer Proto-Datei definiert sind, wie sie vom Proxy-Server erkannt werden.

Weitere Einzelheiten finden Sie in der GRPC Bus WebSocket Proxy client README

10

Wir haben vor kurzem gRPC-Web gebaut (https://github.com/improbable-eng/grpc-web) - einen Browser-Client und Server-Wrapper, der die vorgeschlagene gRPC-Web-Protokoll folgt. Das Beispiel in diesem Repo sollte einen guten Ausgangspunkt bieten.

Sie benötigen entweder einen eigenständigen Proxy oder einen Wrapper für Ihren gRPC-Server, wenn Sie Golang verwenden. Der Proxy/Wrapper ändert die Antwort, um die Trailer im Antworttextkörper so zu verpacken, dass sie vom Browser gelesen werden können.

Offenlegung: Ich bin ein Betreuer des Projekts.

+1

Killer-Funktion wäre jetzt die Möglichkeit, eine HTML-Spielplatz Seite für jede Proto-Datei ähnlich der für Swagger getan zu erstellen. So kann jeder gRPC-Dienst einfach über den Browser getestet werden. – Setheron

0

Mit Blick auf den aktuellen Lösungen mit gRPC über Web, hier ist das, was zu der Zeit da draußen ist das zu schreiben (und was ich gefunden):

Ich möchte auch schamlos meine eigene Lösung stecken, die ich für meine Firma geschrieben, und es ist wobei in der Produktion zu Proxy-Anfragen an einen gRPC Dienst verwendet, die nur einstellige und Server-Streaming-Anrufe beinhaltet:

Jeder Zoll des Codes wird durch Tests abgedeckt. Es handelt sich um eine Express-Middleware, sodass keine zusätzlichen Änderungen an Ihrem gRPC-Setup erforderlich sind. Sie können die HTTP-Authentifizierung auch an Express delegieren (z. B. mit Passport).

Verwandte Themen