2016-01-28 2 views
44

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

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

ответ

15

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

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

См. this issue для обсуждения темы.

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

+0

Спасибо за ваш ответ! Я уже читал о проблеме с трейлерами http. Существует даже патч, который кто-то сделал, чтобы использовать grpc в браузере без функции потоковой передачи. Проект grpc-gateway - полезный намек. Мы, вероятно, сейчас делаем шлюз с dnode ... – Oliver

+1

Да, если вы забыли о потоковой передаче, то grpc из браузера вполне возможно. –

+0

@NicolasNoble - это здорово. Есть ли пример ненагружаемого вызова gRPC из браузера? –

6

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

1

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

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

На стороне браузера, вам необходимо установить GRPC Bus WebSocket Proxy client с 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-адреса различных сервисов, определенных в вашем прото-файле, как это видно на прокси-сервере.

Для получения более подробной информации см GRPC Bus WebSocket Proxy client README

10

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

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

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

+1

Функция убийцы теперь будет способна создать страницу игровой площадки HTML для любого прото-файла, аналогичного тому, что сделано для чванства. Таким образом, любая служба gRPC может быть протестирована с помощью браузера. – Setheron

0

Глядя на текущих решениях с КПГРАМИ над вебом, вот что доступно там на момент написания этого (и что я нашел):

  • gRPC-web: требует Машинописи для клиента
  • gRPC-web-proxy: требует Go
  • gRPC-gateway: требует .proto модификации и украшения
  • gRPC-bus-websocket-proxy-server: от написания этого документа ему не хватает тестов и, кажется, отказались от
  • gRPC-dynamic-gateway: немного излишним для простых услуг КПГР и аутентификации неудобно
  • gRPC-bus: требуется что-то для транспортировки

я также хочу, чтобы бесстыдно подключить свое собственное решение, которое я написал для моей компании, и это используется в производстве для прокси-запросов к службе КПГР, включающий только одинарные и сервер потоковой передачи вызовов:

Каждый дюйм кода покрыт испытаниями. Это промежуточное ПО Express, поэтому для его настройки gRPC не требуется никаких дополнительных изменений. Вы также можете делегировать HTTP-аутентификацию Express (например, с помощью Passport).

Смежные вопросы