Подтвердить что ты не робот

Как привести API-интерфейс, определенный gRPC, в веб-браузер

Мы хотим создать Javascript/HTML gui для наших gRPC-микросервисов. Поскольку gRPC не поддерживается на стороне браузера, мы подумали о использовании веб-сокетов для подключения к серверу node.js, который вызывает целевой сервис через grpc. Мы пытаемся найти элегантное решение для этого. Тем более, что мы используем потоки gRPC для толкания событий между нашими микросервисами. Кажется, нам нужна вторая RPC-система, просто для связи между интерфейсом и сервером node.js. Это, как представляется, много накладных расходов и дополнительный код, который должен поддерживаться.

Есть ли у кого-нибудь опыт, который делает что-то подобное или имеет представление о том, как это можно решить?

4b9b3361

Ответ 1

К сожалению, для вас пока нет хорошего ответа.

Поддержка потоковых RPC из браузера полностью требует, чтобы трейдеры HTTP2 поддерживались браузерами, и во время написания этого ответа они не являются.

См. эту проблему для обсуждения темы.

В противном случае, да, вам понадобится полная система перевода между WebSockets и gRPC. Возможно, вдохновение из grpc-gateway может стать началом такого проекта, но это все еще очень длинный снимок.

Ответ 2

https://github.com/tmc/grpc-websocket-proxy звучит так, как будто он может удовлетворить ваши потребности. Это переводит json через веб-сокеты на grpc (слой поверх grpc-gateway).

Ответ 3

Люди grpc в https://github.com/grpc/ в настоящее время создают js реализация.

Репродукция находится в https://github.com/grpc/grpc-web (дает 404 → ), который в настоящее время (2016-12-20), в раннем доступе, поэтому вам необходимо запросить доступ.

Ответ 4

Недавно мы построили gRPC-Web (https://github.com/improbable-eng/grpc-web) - оболочку клиента и сервера браузера, которая следует за предлагаемым протоколом gRPC-Web. Пример в этом репо должен стать хорошей отправной точкой.

Для использования Golang требуется либо автономный прокси, либо оболочка для вашего сервера gRPC. Прокси/обертка изменяет ответ на упаковку трейлеров в теле ответа, чтобы они могли быть прочитаны браузером.

Раскрытие информации: Я поддерживаю проект.

Ответ 5

GRPC Bus WebSocket Proxy делает именно это, проксизывая все вызовы GRPC через соединение WebSocket, чтобы дать вам что-то похожее на API Node GRPC в браузере. В отличие от GRPC-Gateway, он работает как с потоковыми запросами, так и с потоковыми ответами, а также с потоковыми вызовами.

Существует как серверный, так и клиентский компоненты. GRPC Bus WebSocket Proxy server можно запустить с помощью Docker, выполнив docker run gabrielgrant/grpc-bus-websocket-proxy

В браузере вам нужно будет установить клиентский сервер GRPC Bus WebSocket Proxy с npm install grpc-bus-websocket-client

а затем создайте новый объект GBC с помощью: new GBC(<grpc-bus-websocket-proxy address>, <protofile-url>, <service map>)

Например:

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

Клиентская библиотека ожидает, что сможет загрузить файл .proto с запросом AJAX. service-map предоставляет URL-адреса различных сервисов, определенных в вашем прото файле, как видно прокси-серверу.

Для получения дополнительной информации см. README прокси-сервера GRPS Bus WebSocket