2016-01-28 20 views
44

Chcemy zbudować kod JavaScript/HTML dla naszych usług micro-services gRPC. Ponieważ gRPC nie jest obsługiwany po stronie przeglądarki, pomyśleliśmy o używaniu gniazd internetowych do połączenia się z serwerem node.js, który wywołuje usługę docelową przez grpc. Staramy się znaleźć eleganckie rozwiązanie, aby to zrobić. Zwłaszcza, że ​​wykorzystujemy strumienie gRPC do przesyłania wydarzeń między naszymi mikroukładami. Wygląda na to, że potrzebujemy drugiego systemu RPC, aby komunikować się między front-endem a serwerem node.js. Wydaje się, że jest to dużo kosztów ogólnych i dodatkowych, które należy zachować.Jak wprowadzić API zdefiniowane przez gRPC do przeglądarki internetowej?

Czy ktoś ma doświadczenie w robieniu czegoś takiego lub ma pomysł, jak można to rozwiązać?

Odpowiedz

15

Niestety, nie ma jeszcze dla Ciebie żadnej dobrej odpowiedzi.

Obsługa przesyłania strumieniowego wywołań RPC z przeglądarki w pełni wymaga przeglądarek HTTP2 obsługiwanych przez przeglądarki, a w chwili pisania tej odpowiedzi nie są one obsługiwane.

Zobacz this issue do dyskusji na ten temat.

W przeciwnym razie, potrzebny jest pełny system translacji pomiędzy WebSockets i gRPC. Być może inspiracja z grpc-gateway może być początkiem takiego projektu, ale to wciąż bardzo długie ujęcie.

+0

Dzięki za odpowiedź! Już czytałem o problemie z przyczepami http. Istnieje nawet łatka, którą ktoś zrobił, aby można było używać grpc w przeglądarce bez funkcji przesyłania strumieniowego. Projekt grpc-gateway jest przydatną wskazówką. Prawdopodobnie robimy teraz bramę z dnode ... – Oliver

+1

Tak, jeśli zapomnisz o streamowaniu, to grpc z przeglądarki jest całkowicie możliwy. –

+0

@NicolasNoble - to świetnie. Czy istnieje przykład połączenia strumieniowego GRPC z przeglądarki? –

1

Serwer sieci Web GRPC Bus WebSocket Proxy wykonuje to dokładnie poprzez proxy wszystkich wywołań GRPC przez połączenie WebSocket, aby uzyskać coś, co wygląda bardzo podobnie do interfejsu API węzła GRPC w przeglądarce. W przeciwieństwie do bramy GRPC, działa zarówno z żądaniami strumieniowania, jak i odpowiedziami strumieniowymi, a także z połączeniami bez przesyłania strumieniowego.

Istnieje zarówno serwer, jak i składnik klienta. GRPC Bus WebSocket Proxy server można uruchomić z Döcker wykonując docker run gabrielgrant/grpc-bus-websocket-proxy

Po stronie przeglądarki, musisz zainstalować GRPC Bus WebSocket Proxy client z npm install grpc-bus-websocket-client

a następnie utworzyć nowy obiekt z GBC: new GBC(<grpc-bus-websocket-proxy address>, <protofile-url>, <service map>)

Na przykład :

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 
    }); 

Biblioteka klienta oczekuje, że będzie mogła pobrać plik .proto Żądanie AJAX. service-map udostępnia adresy URL różnych usług zdefiniowanych w pliku proto widocznym dla serwera proxy.

Aby uzyskać więcej informacji, zobacz GRPC Bus WebSocket Proxy client README

10

Niedawno wybudowany gRPC-Web (https://github.com/improbable-eng/grpc-web) - klient przeglądarki i serwera, który następuje owinięcie proponowanego protokołu gRPC-Web. Przykład tego repozytorium powinien stanowić dobry punkt wyjścia.

Wymaga to samodzielnego serwera proxy lub opakowania dla serwera gRPC, jeśli używasz Golang. Proxy/wrapper modyfikuje odpowiedź, aby spakować zwiastuny w treści odpowiedzi, aby mogły być odczytywane przez przeglądarkę.

Ujawnienie: Jestem opiekunem projektu.

+1

Funkcja zabójcy byłaby teraz zdolna do stworzenia strony z zabawkami HTML dla dowolnego pliku proto podobnego do tego, który zrobił dla łobuza. W ten sposób można łatwo przetestować dowolną usługę gRPC za pośrednictwem przeglądarki. – Setheron

0

Patrząc na obecnych rozwiązań z gRPC ponad internecie, tutaj jest to, co jest dostępne tam w chwili pisania tego (i co znalazłem):

Chcę również bezwstydnie podłączyć własne rozwiązanie, które napisałem dla mojej firmy i jest to wykorzystywane w produkcji do żądań do serwera proxy usługi gRPC który zawiera tylko jednoargumentowy i serwer streaming połączeń:

Każdy cal kodu jest objęty testami. Jest to oprogramowanie pośrednie Express, więc nie wymaga żadnych dodatkowych modyfikacji w konfiguracji gRPC. Możesz również przekazać uwierzytelnianie HTTP do Express (np. Za pomocą usługi Passport).