Введение
gRPC (gRPC Remote Procedure Calls) – открытый высокопроизводительный фреймворк удалённого вызова процедур, разработанный Google и выпущенный в 2015 году. gRPC строится на двух ключевых технологиях: HTTP/2 как транспортный протокол и Protocol Buffers (protobuf) как формат сериализации данных и описания интерфейсов.
gRPC стал стандартным протоколом взаимодействия в cloud-native архитектурах: его используют Kubernetes, Istio, Envoy, etcd, TensorFlow Serving, Jaeger. По данным бенчмарков, gRPC обеспечивает на 20-40% меньшую задержку по сравнению с REST/JSON за счёт бинарной сериализации и мультиплексирования HTTP/2.
История и контекст
gRPC является эволюцией внутреннего фреймворка Google Stubby, использовавшегося для взаимодействия между тысячами внутренних сервисов. В 2015 году Google открыл исходный код и создал gRPC на основе Stubby с использованием открытого стандарта HTTP/2 (вместо проприетарного транспорта) и Protocol Buffers (которые уже были открыты ранее).
В 2016 году gRPC был передан в CNCF. Сегодня gRPC поддерживается на более чем 11 языках программирования: Go, Java, C++, Python, Ruby, C#, Node.js, PHP, Dart, Kotlin, Swift. Версия 1.0 была выпущена в 2016 году, и фреймворк активно развивается.
Как это работает
Работа с gRPC начинается с определения сервиса в .proto файле на языке Protocol Buffers:
- Определяются сообщения (структуры данных) с типизированными полями.
- Определяется сервис с методами (RPC-вызовами).
- Компилятор
protocгенерирует клиентский и серверный код на целевом языке.
gRPC поддерживает 4 типа вызовов:
- Unary RPC: классический запрос-ответ. Клиент отправляет один запрос, сервер отвечает одним сообщением.
- Server Streaming RPC: клиент отправляет один запрос, сервер возвращает поток сообщений (например, результаты поиска по частям).
- Client Streaming RPC: клиент отправляет поток сообщений, сервер отвечает одним сообщением (например, загрузка файла по частям).
- Bidirectional Streaming RPC: оба участника обмениваются потоками сообщений независимо (например, чат, real-time аналитика).
Технические преимущества gRPC:
- HTTP/2: мультиплексирование нескольких запросов в одном TCP-соединении, сжатие заголовков (HPACK), server push.
- Protocol Buffers: бинарная сериализация – в 3-10 раз компактнее JSON. Строгая схема с версионированием (номера полей).
- Deadlines/Timeouts: встроенный механизм отмены запросов по таймауту, передаётся через контекст.
- Interceptors: middleware-механизм для аутентификации, логирования, трассировки (аналог middleware в HTTP-фреймворках).
- Load Balancing: gRPC поддерживает клиентскую балансировку (round robin, lookaside) – важно для микросервисов.
gRPC vs REST
Сравнение gRPC и REST/HTTP+JSON:
- Производительность: gRPC значительно быстрее за счёт бинарного protobuf и HTTP/2.
- Типобезопасность: gRPC гарантирует типы через proto-схему; REST – нет (JSON невалидируем без дополнительных инструментов).
- Streaming: gRPC нативно поддерживает двунаправленный стриминг; в REST для этого нужны WebSocket или SSE.
- Читаемость: REST/JSON читается человеком без инструментов; для gRPC/protobuf нужен protoc или инструмент типа grpcurl.
- Браузерная поддержка: REST поддерживается напрямую; gRPC в браузере требует grpc-web транслятора.
Где применяется
- Внутренние микросервисные API: gRPC – стандарт для east-west трафика между микросервисами благодаря производительности и типобезопасности.
- ML-инференс: TensorFlow Serving, Triton Inference Server используют gRPC для высокопроизводительной передачи тензоров.
- Kubernetes internals: kube-apiserver, etcd, kubelet общаются по gRPC.
- Мобильные приложения: gRPC эффективен на мобильных сетях благодаря компактности protobuf.
- Финансовые системы: биржевые платформы используют gRPC для streaming рыночных данных.
Связь с другими понятиями
- Service Mesh (Istio): service mesh обеспечивает L7 балансировку gRPC-запросов, mTLS и observability. Без service mesh Kubernetes балансирует только TCP-соединения, что ломает равномерное распределение gRPC-нагрузки.
- OpenTelemetry: gRPC поддерживает propagation контекста трассировки через метаданные (binary и text format).
- Protocol Buffers: основной формат сериализации gRPC, определяет строгую схему API.
- Microservices: gRPC является предпочтительным протоколом для синхронного взаимодействия в микросервисных архитектурах.