Открыть сервис

gRPC

gRPC — это система удалённого вызова процедур (RPC), разработанная компанией Google, которая использует протокол HTTP/2 для транспорта и Protocol Buffers (protobuf) в качестве интерфейса описания служб и формата сериализации данных. gRPC обеспечивает высокую производительность, строгую типизацию и поддержку множества языков программирования, что делает его популярным выбором для построения микросервисных архитектур и распределённых систем.

История

Разработка gRPC началась в 2015 году в недрах Google как внутренняя эволюция существовавшей RPC-инфраструктуры Stubby. В феврале 2015 года Google выпустила gRPC как открытый проект с открытым исходным кодом, опубликовав спецификации и эталонные реализации на GitHub. Основной целью было создание универсального, высокопроизводительного и кроссплатформенного фреймворка, который мог бы заменить как собственные внутренние решения, так и устаревшие технологии, такие как SOAP и XML-RPC.

В 2016 году gRPC стал частью Cloud Native Computing Foundation (CNCF) — организации, управляющей развитием экосистемы облачных нативных технологий. Это способствовало его широкому распространению в индустрии, особенно в контексте контейнеризации и оркестрации (например, в проектах Kubernetes и Envoy).

Архитектура и протокол

Transport Layer

gRPC использует протокол HTTP/2 в качестве транспортного уровня. HTTP/2 обеспечивает мультиплексирование запросов и ответов по одному TCP-соединению, сжатие заголовков (HPACK) и поддержку потоковой передачи данных. Это позволяет gRPC эффективно обрабатывать множество параллельных вызовов без блокировки и с низкой задержкой.

Serialization

По умолчанию gRPC использует Protocol Buffers (protobuf) — компактный бинарный формат сериализации, разработанный Google. Protobuf обеспечивает строгую типизацию данных, автоматическую генерацию кода для клиентов и серверов на десятках языков, а также высокую скорость сериализации/десериализации. Альтернативно можно использовать JSON, но это снижает производительность.

Interface Definition Language (IDL)

Сервисы и сообщения в gRPC описываются в файлах .proto с использованием синтаксиса Protocol Buffers. Пример определения сервиса:

```protobuf service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); }

message HelloRequest { string name = 1; }

message HelloReply { string message = 1; } ```

Из этого файла автоматически генерируются клиентские и серверные заглушки (stubs) на выбранном языке.

Типы вызовов

gRPC поддерживает четыре основных типа взаимодействия:

  1. Unary RPC (одиночный вызов): Клиент отправляет один запрос и получает один ответ. Это классический паттерн запрос-ответ.
  2. Server streaming RPC: Клиент отправляет один запрос, а сервер в ответ присылает поток сообщений. Клиент читает их по мере поступления.
  3. Client streaming RPC: Клиент отправляет поток сообщений, а сервер после получения всех данных отправляет один ответ.
  4. Bidirectional streaming RPC: Обе стороны обмениваются потоками сообщений независимо друг от друга. Клиент и сервер могут читать и писать в произвольном порядке.

Реализации и поддержка языков

gRPC официально поддерживается для следующих языков и платформ:

  • C++, Java, Python, Go, Ruby, C#, Node.js, PHP, Dart, Objective-C, Swift, Rust (через сторонние реализации, например, Tonic).

Для каждого языка существует набор инструментов: компилятор protobuf (protoc), плагины для генерации gRPC-кода, а также библиотеки времени выполнения (grpc для сервера и клиента).

Применение

Микросервисная архитектура

gRPC широко используется в микросервисных системах благодаря низкой задержке, поддержке потоковой передачи и строгой типизации. Он часто применяется для внутренней коммуникации между сервисами, в то время как для внешних API (например, для веб-клиентов) может использоваться REST или GraphQL.

Встроенные и мобильные системы

Благодаря компактным бинарным сообщениям и поддержке HTTP/2, gRPC подходит для мобильных приложений и устройств с ограниченными ресурсами. Google использует его в своих сервисах, таких как Google Maps и Google Cloud.

Инфраструктура и облачные технологии

Многие проекты CNCF и облачные платформы (например, etcd, Envoy, Istio, Linkerd) используют gRPC для внутренних коммуникаций. gRPC также является стандартом для взаимодействия с сервисами Google Cloud Platform.

Преимущества

  • Высокая производительность: бинарный протокол, мультиплексирование HTTP/2, сжатие заголовков.
  • Строгая типизация: автоматическая генерация кода из .proto файлов исключает ошибки сериализации.
  • Поддержка потоковой передачи: позволяет реализовать долгоживущие соединения и push-уведомления.
  • Кроссплатформенность: единый интерфейс для множества языков.
  • Встроенная поддержка аутентификации и шифрования: через TLS, а также механизмы токенов (JWT, OAuth2).

Недостатки

  • Сложность отладки: бинарный формат (protobuf) менее читаем для человека по сравнению с JSON.
  • Ограниченная поддержка браузеров: HTTP/2 не полностью поддерживается в браузерах, поэтому для веб-клиентов требуется прокси (например, gRPC-Web) или использование REST.
  • Кривая обучения: требуется понимание Protocol Buffers и HTTP/2.
  • Меньшая экосистема инструментов: по сравнению с REST, меньше готовых библиотек для тестирования, мониторинга и документирования.

Сравнение с REST

ХарактеристикаgRPCREST
ПротоколHTTP/2HTTP/1.1 (чаще)
Формат данныхProtobuf (бинарный)JSON, XML (текстовый)
ТипизацияСтрогая (через IDL)Неявная (схема не обязательна)
Потоковая передачаПоддерживается (4 типа)Ограничена (только запрос-ответ)
ПроизводительностьВысокаяСредняя
Поддержка браузеровОграничена (через gRPC-Web)Нативная
ДокументированиеАвтоматическое из .protoOpenAPI, Swagger

Инструменты и экосистема

  • gRPCurl: утилита командной строки для тестирования gRPC-сервисов.
  • gRPC-Web: прокси-сервер для обеспечения работы gRPC в браузерах.
  • gRPC Gateway: генерирует REST-прокси из .proto файлов.
  • Envoy: прокси-сервер, который может выступать в роли gRPC-шлюза, балансировщика нагрузки и маршрутизатора.
  • Protobuf Editor: онлайн-редакторы и плагины для IDE (VS Code, IntelliJ) для работы с .proto файлами.

Источники

  1. Официальная документация gRPC (grpc.io).
  2. Спецификация Protocol Buffers (protobuf.dev).
  3. Документация Cloud Native Computing Foundation (cncf.io).
  4. Книга «gRPC: Up and Running» (Kasun Indrasiri, Danesh Kuruppu).
  5. Статья «gRPC vs REST: Understanding gRPC, OpenAPI and REST» (Google Cloud Blog).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →