Об этом проекте
grpc-web - это реализация gRPC для браузерных клиентов на JavaScript, поддерживаемая в репозитории grpc/grpc-web. Поскольку браузеры не могут открывать сырые HTTP/2-соединения gRPC, клиенты gRPC-web общаются с сервисами gRPC через специальный прокси; Envoy является прокси-сервером по умолчанию, и проект также документирует совместимость с прокси gRPC-web на Go, Apache APISIX и модулем gRPC Nginx.
Проект поставляется с двумя основными компонентами. Во-первых, это библиотека времени выполнения, опубликованная в npm как `grpc-web`, которая теперь полностью написана на TypeScript и, таким образом, обеспечивает первоклассную безопасность типов, отсутствие зависимостей во время выполнения и встроенные определения типов. Во-вторых, это плагин protoc, `protoc-gen-grpc-web`, который генерирует клиентские сервисные заглушки из определений `.proto`. Генерация обычно сочетает стандартный плагин `--js_out` (для классов сообщений protobuf) с `--grpc-web_out` (для сервисной заглушки) и может быть объединена с Browserify, Webpack или Closure Compiler.
Поддерживаются режимы RPC: унарные вызовы и серверное потоковое вещание. Серверное потоковое вещание доступно только в режиме формата проводки `grpcwebtext`, где полезные данные кодируются в base64 и отправляются с `Content-Type: application/grpc-web-text`. Бинарный режим, `grpcweb`, использует `Content-Type: application/grpc-web+proto` с бинарными полезными данными protobuf, но поддерживает только унарные вызовы. Клиентское и двустороннее потоковое вещание в настоящее время не поддерживаются.
Генерация кода предлагает несколько стилей импорта: `closure` (по умолчанию, использующий `goog.require()`), `commonjs` (использующий `require()`), `commonjs+dts` (заглушки CommonJS плюс файл определения типов `.d.ts`) и `typescript` (полный вывод TypeScript). Стили `commonjs+dts` и `typescript` поддерживаются только `--grpc-web_out`, но не `--js_out`. В файле README приведен конкретный пример генерации кода TypeScript с бинарным форматом проводки, который производит клиент сервиса TypeScript, модуль protobuf JavaScript и соответствующий файл определения `.d.ts`.
Использование клиента простое: создайте экземпляр клиента сервиса с URL-прокси, создайте сообщение запроса и вызовите RPC с необязательными метаданными и обратным вызовом. Серверное потоковое вещание возвращает объект потока с событиями `data`, `status` и `end`, а также методом `cancel()`. Срок можно установить, передав заголовок `deadline`, содержащий метку времени Unix в миллисекундах. Доступны два стиля клиентов: клиенты на основе обратного вызова и клиенты на основе обещаний, хотя вариант обещания не может получить доступ к обратным вызовам `.on(...)` для метаданных и статуса.
Можно реализовать и объединить пользовательские перехватчики для функций, таких как аутентификация и повторные попытки. Существует два типа перехватчиков: `UnaryInterceptor`, который перехватывает унарные RPC и может использоваться только с клиентами на основе обещаний, и `StreamInterceptor`, который более универсален и работает с обычными клиентами.
В репозиторий включен пример Hello World, который описывает определение сервиса с помощью protocol buffers, реализацию сервиса gRPC Node.js, настройку прокси Envoy, генерацию классов protobuf и клиентских заглушек, а также компиляцию зависимостей JS в статическую библиотеку. Более продвинутый демонстрационный пример Echo можно запустить с помощью Docker Compose и предоставляет веб-страницу для тестирования потокового вещания. В файле README также есть ссылки на интеграции экосистемы, включая серверные фреймворки Armeria (JVM) и Tonic (Rust) с поддержкой gRPC-web, а также демонстрацию совместимости Vite. Документ по дорожной карте описывает будущую работу, включая поддержку языка для веб-фреймворков Python, Java и Node.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.