Як перенести API, визначений gRPC, у веб-браузер


78

Ми хочемо створити графічний інтерфейс Javascript / HTML для наших gRPC-мікросервісів. Оскільки gRPC не підтримується з боку браузера, ми думали використовувати веб-сокети для підключення до сервера node.js, який викликає цільову службу через grpc. Ми намагаємось знайти елегантне рішення для цього. Особливо, оскільки ми використовуємо потоки gRPC для переміщення подій між нашими мікрослугами. Здається, нам потрібна друга система RPC, просто для спілкування між інтерфейсом та сервером node.js. Здається, це багато накладних витрат і додатковий код, який потрібно підтримувати.

Хтось має досвід виконання чогось подібного або має уявлення, як це можна вирішити?


Ознайомтеся з Wildcard API, який є невеликим інструментом, що дозволяє легко створити RPC API між вашим інтерфейсом та сервером Node.js. Це як gRPC, але набагато простіший та набагато простіший у використанні. Розкриття інформації: Я автор.
блискучий випуск

Відповіді:


40

Редагувати: З 23 жовтня 2018 р. Веб-проект gRPC-Web є GA , що може бути найбільш офіційним / стандартизованим способом вирішення вашої проблеми. (Навіть якщо зараз уже 2018 рік ...;))

З блогу GA: "gRPC-Web, як і gRPC, дозволяє визначити" контракт "на обслуговування між клієнтом (веб) і серверними сервісами gRPC за допомогою буферів протоколів. Клієнт може бути автоматично створений. [...]"

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

Для використання Golang потрібен автономний проксі-сервер або обгортка для вашого сервера gRPC. Проксі-сервер / обгортка модифікує відповідь, щоб упакувати трейлери в тілі відповіді, щоб браузер їх читав.

Розкриття інформації: Я супроводжувач проекту.


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

1
@Marcus, ти кажеш, що це відповідає "Пропонованому протоколу gRPC-Web". Це той самий протокол, який використовується офіційною реалізацією github.com/grpc/grpc-web (який нещодавно був оприлюднений), і чи будуть ці реалізації таким чином сумісними? Або ви маєте на увазі запропонований вами власний протокол?
Matthijs Kooijman

@Setheron, чи можете ви дати мені посилання на приклад чи опис цієї функції створення вбивства? Я ще не можу його знайти :( У мене є gRPC-веб-додаток (node.js) з двійковими (base64) повідомленнями та проксі-програмою Envoy, як в офіційних документах, і я хочу мати схожий інструмент для тестування мого додатка
razon

Чи можна цей проект також пов'язати з wordpress (php)?
Raju yourPepe

16

На жаль, поки що немає хорошої відповіді для вас.

Підтримка потокових RPC з браузера повністю вимагає, щоб браузери підтримували трейлери HTTP2, і на момент написання цієї відповіді вони цього не роблять.

Див. Це питання для обговорення теми.

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


Дякую за вашу відповідь! Я вже читав про проблему з трейлерами http. Існує навіть латка, яку хтось зробив, щоб можна було використовувати grpc у браузері без функції потокового передавання. Проект grpc-gateway є корисною підказкою. Ми, мабуть, зараз робимо шлюз з dnode ...
Олівер

1
Так, якщо ви забудете про потокове передавання, то grpc з браузера цілком можливий.
Ніколас Ноубл

@NicolasNoble - це чудово. Чи є приклад виклику gRPC без потоку з браузера?
AlikElzin-kilaka

На жаль, поки що немає. Я говорив теоретично. Але зміни повинні бути мінімальними.
Ніколас Ноубл

1
Ми збираємо імена людей , зацікавлених в програмі раннього доступу тут . Не соромтеся додати своє ім’я там, і ми незабаром поділимось тим, що маємо.
Ніколас Ноубл

10

Офіційна реалізація grpc-web (бета) була випущена 23.03.2018. Ви можете знайти це за адресою

https://github.com/grpc/grpc-web

Наступні інструкції взяті з README:

Визначте свою послугу gRPC:

service EchoService {
  rpc Echo(EchoRequest) returns (EchoResponse);

  rpc ServerStreamingEcho(ServerStreamingEchoRequest)
      returns (stream ServerStreamingEchoResponse);
}

Створіть сервер якою завгодно мовою.

Створіть свій JS-клієнт для здійснення дзвінків із браузера:

var echoService = new proto.grpc.gateway.testing.EchoServiceClient(
  'http://localhost:8080');

Зробіть одинарний виклик RPC

var unaryRequest = new proto.grpc.gateway.testing.EchoRequest();
unaryRequest.setMessage(msg);
echoService.echo(unaryRequest, {},
  function(err, response) {
    console.log(response.getMessage());
  });

Підтримуються потоки з сервера на браузер:

var stream = echoService.serverStreamingEcho(streamRequest, {});
stream.on('data', function(response) {
  console.log(response.getMessage());
});

Двонаправлені потоки НЕ підтримуються:

Це робота, що триває та над дорожньою картою grpc-web . Незважаючи на те, що є приклад protobuf, що показує потокове передавання Bidi, цей коментар чітко показує, що цей приклад ще не працює.

Сподіваємось, це скоро зміниться. :)


1
Ви впевнені, що підтримуються двонаправлені потоки? Здається, ваш двонаправлений приклад відображає лише потокове передавання даних із сервера, тоді як приклад потокового передавання серверів показує лише одинарний запит без потокового передавання. README також згадує лише потокове передавання з сервера, що змушує мене підозрювати, що клієнтське або двонаправлене потокове передавання не підтримується. Не могли б ви пояснити?
Matthijs Kooijman

2
@MatthijsKooijman Їх приклад відлуння показує як клієнтське, так і повне дуплексне потокове передавання: github.com/grpc/grpc-web/blob/master/net/grpc/gateway/examples/…
Коді А. Рей

1
здається, що цей приклад призначений лише для подальшого використання, він фактично не підтримується. Див. Також github.com/grpc/grpc-web/issues/24#issuecomment-303285538, де це про приклад явно зазначено.
Matthijs Kooijman

1
@MatthijsKooijman схоже на те, що ти маєш рацію. Я оновив свою відповідь, щоб відобразити це (і включив посилання на дорожню карту та коментар). Дякую!
Cody A. Ray

1
тепер ви видалили приклад сервера потокового передавання зі своєї відповіді (який раніше ви неправильно позначили як двонаправлене потокове передавання).
Matthijs Kooijman


7

Наразі користувачі grpc на https://github.com/grpc/ створюють реалізацію js .

Повторне видання знаходиться за адресою https://github.com/grpc/grpc-web (дає 404 ->), яке наразі (20.12.2016) перебуває у достроковому доступі, тому вам потрібно запитати доступ .


Це репо зараз відкрите, також див. Відповідь Коді.
Matthijs Kooijman

3

GRPC Bus WebSocket Proxy робить саме це, проксіруючи всі виклики GRPC через з'єднання WebSocket, щоб отримати щось, що дуже схоже на API Node GRPC у браузері. На відміну від GRPC-Gateway, він працює як із запитами на потокове передавання, так і з потоковими відповідями, а також із потоковими дзвінками.

Існує як серверний, так і клієнтський компонент. Сервер КПГР Bus WebSocket Proxy може працювати з Докер, роблячи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 шини GRPC WebSocket Proxy


2

Я бачу, що багато відповідей не вказували на двонаправлене рішення через WebSocket, оскільки ОП просило підтримку браузера.

Ви можете використовувати JSON-RPC замість gRPC, щоб отримати двонаправлений RPC через WebSocket , який підтримує набагато більше, включаючи WebRTC (браузер до браузера).

Я думаю, його можна було б змінити для підтримки gRPC, якщо вам справді потрібен такий тип серіалізації.

Однак для вкладки браузера до вкладки браузера об’єкти запиту не серіалізуються і передаються власним способом, а те саме відбувається з кластерами або потоковими роботами NodeJS, що забезпечує набагато більшу продуктивність.

Крім того, ви можете перенести "вказівники" на SharedArrayBuffer, замість серіалізації через формат gRPC.

Серіалізація та десеріалізація JSON у V8 також неперевершена.

https://github.com/bigstepinc/jsonrpc-bidirectional


0

Дивлячись на поточні рішення з gRPC через Інтернет, ось що доступно на момент написання цього (і що я знайшов):

  • gRPC-web : потрібен TypeScript для клієнта
  • gRPC-веб-проксі : потрібно Go
  • gRPC-шлюз : вимагає модифікації .proto та прикраси
  • gRPC-bus-websocket-proxy-server : станом на момент написання цього документа він не має тестів і здається покинутим (редагувати: подивитись коментарі оригінального автора!)
  • gRPC-динамічний шлюз : трохи надмірного для простих послуг gRPC та автентифікації незручно
  • gRPC-шина : потрібно щось для транспорту

Я також хочу безсоромно підключити власне рішення, яке я написав для своєї компанії, і воно використовується у виробництві для проксі-запитів до служби gRPC, що включає лише одинарні та потокові дзвінки на сервері:

Кожен дюйм коду охоплюється тестами. Це проміжне програмне забезпечення Express, тому воно не потребує додаткових змін у налаштуваннях вашого gRPC. Ви також можете делегувати автентифікацію HTTP у Express (наприклад, за допомогою паспорта).


Гей! grpc-express виглядає круто, особливо. для тих, хто використовує Express, кому не потрібна потокова передача клієнта. Мені цікаво, які додаткові тести ви хотіли б для gRPC-bus-websocket-proxy-server ? Це досить тонкий шар обгортки / транспорту для grpc-bus (який досить добре перевірений модулем), тому я не думаю, що насправді має сенс дублювати їх, і "демонстрація" - це фактично тест прийняття. У будь-якому випадку, ми активно використовуємо його в Pachyderm , просто останнім часом його не потрібно було оновлювати, оскільки він здебільшого просто працює :)
Габріель Грант,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.