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 поддерживает четыре основных типа взаимодействия:
- Unary RPC (одиночный вызов): Клиент отправляет один запрос и получает один ответ. Это классический паттерн запрос-ответ.
- Server streaming RPC: Клиент отправляет один запрос, а сервер в ответ присылает поток сообщений. Клиент читает их по мере поступления.
- Client streaming RPC: Клиент отправляет поток сообщений, а сервер после получения всех данных отправляет один ответ.
- 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
| Характеристика | gRPC | REST |
|---|---|---|
| Протокол | HTTP/2 | HTTP/1.1 (чаще) |
| Формат данных | Protobuf (бинарный) | JSON, XML (текстовый) |
| Типизация | Строгая (через IDL) | Неявная (схема не обязательна) |
| Потоковая передача | Поддерживается (4 типа) | Ограничена (только запрос-ответ) |
| Производительность | Высокая | Средняя |
| Поддержка браузеров | Ограничена (через gRPC-Web) | Нативная |
| Документирование | Автоматическое из .proto | OpenAPI, Swagger |
Инструменты и экосистема
- gRPCurl: утилита командной строки для тестирования gRPC-сервисов.
- gRPC-Web: прокси-сервер для обеспечения работы gRPC в браузерах.
- gRPC Gateway: генерирует REST-прокси из
.protoфайлов. - Envoy: прокси-сервер, который может выступать в роли gRPC-шлюза, балансировщика нагрузки и маршрутизатора.
- Protobuf Editor: онлайн-редакторы и плагины для IDE (VS Code, IntelliJ) для работы с
.protoфайлами.
Источники
- Официальная документация gRPC (grpc.io).
- Спецификация Protocol Buffers (protobuf.dev).
- Документация Cloud Native Computing Foundation (cncf.io).
- Книга «gRPC: Up and Running» (Kasun Indrasiri, Danesh Kuruppu).
- Статья «gRPC vs REST: Understanding gRPC, OpenAPI and REST» (Google Cloud Blog).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →