Перейти к основному содержимому

gRPC: подробнее

gRPC — реализует парадигму удаленного вызова процедур (RPC), где клиент вызывает методы на сервере так, будто они находятся в одном процессе.

Преимущество gRPC: строгая типизация и контрактное программирование. В gRPC контракт является исполняемым кодом. Это снижает количество ошибок и ускоряет разработку.

Protocol Buffers

Процесс разработки с gRPC всегда начинается с проектирования контракта в proto-файлах.

Контракт (.proto файл) — единая точка, в которой описываются:

  • структуры данных (сообщения),
  • методы сервисов,
  • входные и выходные параметры.

На основе proto-файлов автоматически генерируется клиентский и серверный код для разных языков, что снижает риски несовместимости и ускоряет разработку.

Protobuf — наиболее часто используемый IDL для gRPC. Здесь хранятся данные и функциональные контракты в виде прото-файла

Файл proto действует как промежуточный контракт для клиента, чтобы вызвать любые доступные функции с сервера.

Protobuf также имеет собственные механизмы, в отличие от обычного REST API, который просто отправляет строки JSON в виде байтов.

gRPC Interceptors

Interceptor ("перехватчик")— компонент, который позволяет внедрять пользовательскую логику в обработку вызовов gRPC на стороне клиента / сервера. Предоставляет механизм для изменения запросов и ответов, а также для выполнения доп действий ( логирование, аутентификация, авторизация и сбор метрик)

Аналогия: фильтры в веб-фреймворках или перехватчики в HTTP-клиентах

Типы

  • Client-side: перехватывают исходящие вызовы от клиента к серверу. Работают на стороне клиента и могут модифицировать запросы перед отправкой, обрабатывать ответы и ошибки.
  • Server-side: перехватывают входящие вызовы на сервере. Выполняются до передачи запроса бизнес-логике и после формирования ответа, но перед отправкой клиенту.

Связь с Protocol Buffers

Независимость от контракта.

Interceptors работают на более высоком уровне абстракции, чем конкретные proto-сообщения. Они оперируют:

  • Именами сервисов и методов
  • Метаданными вызовов
  • Статусами выполнения
  • Таймингами и ошибками

Не требуют знания конкретных структур данных, определенных в proto-файлах → универсальные и применимы ко всем сервисам в системе.

  • Protocol Buffers определяют ЧТО передается,
  • Interceptors определяют КАК обрабатываются вызовы.

Сценарии использования

  • проверка токенов, валидация прав доступа к методам, добавление учетных данных в метаданные.
  • сбор статистики по времени выполнения, количеству вызовов, ошибкам. Интеграция с системами мониторинга.
  • централизованное логирование входящих и исходящих вызовов, трассировка запросов в распределенных системах.
  • Retry-логика, таймауты, circuit breakers, балансировка нагрузки на клиентской стороне.
  • проверка корректности запросов, преобразование данных, кэширование ответов.

gRPC в микросервисной архитектуре

gRPC — связующий слой для микросервисов. Полезен:

  • для внутренней коммуникации (быстрая и строгая),
  • в системах с многоязычной средой (Go, Java, Python, .NET),
  • в кейсах, где нужна низкая задержка и потоковые данные.
  • больше количество взаимодействий между сервисами

Сравнение:

  • REST — для публичных API (простота, человекочитаемость);
  • GraphQL — для гибких клиентских запросов;
  • gRPC — для service-to-service обмена внутри системы.

gRPC и Kafka

gRPC — про синхронные вызовы. Kafka — про асинхронный обмен событиями. Обычно дополняют друг друга:

  • gRPC обрабатывает пользовательский запрос «здесь и сейчас»;
  • Kafka распространяет событие дальше (например, «ЗаказСоздан»).

В архитектурах встречается гибрид: gRPC для онлайн-коммуникации, Kafka для фоновой обработки и интеграций.

Пример 1: система заказов. Клиент → gRPC → Сервис А → Kafka → Сервис Б, Сервис В

  1. Клиент через gRPC создает заказ
  2. Сервис заказов обрабатывает команду "создать заказ"
  3. Публикует событие "OrderCreated" в Kafka
  4. Сервисы уведомлений и аналитики получают событие из Кафка

В онлайн-сценариях gRPC и Kafka могут работать параллельно:

  • gRPC-стриминг используется для передачи данных в реальном времени конкретному клиенту
  • Kafka распределяет события по всем заинтересованным сервисам.

Пример 2: торговая платформа, стриминг данных + gRPC API

Данные: Источники → Kafka → Обработчики API: Клиенты ↔ gRPC ↔ Сервис запросов

  • Ценные бумаги идут потоком в Kafka
  • Processing services анализируют данные
  • gRPC API используется для клиентских запросов текущих цен

Примеры архитектур с gRPC

Банковская система: gRPC связывает микросервисы обработки платежей, управления счетами и проверки безопасности.

Онайн-магазин: Сервисы каталога товаров, корзины, заказов и инвентаря общаются через gRPC. Высокая пропускная способность позволяет обрабатывать тысячи запросов в секунду.

Приложение для доставки: gRPC-streaming для получения обновлений о местоположении курьера в реальном времени. Эффективное использование сети важно для мобильных устройств.

Стриминговый сервис: gRPC управляет коммуникацией между сервисами рекомендаций, биллинга и контент-доставки. Двунаправленные стримы - для управления видеопотоками.

Производительность и оптимизация

gRPC быстрее REST благодаря:

  • Protobuf: меньше размер сообщений, быстрее сериализация;
  • HTTP/2: мультиплексирование, сжатие заголовков, постоянные соединения;
  • Keep-alive и пулы соединений: меньше накладных расходов (на установку TCP-соединений), gRPC поддерживает одно соединение для множества вызовов.

Рекомендации:

  • Использование потоков для больших объемов данных
  • Настройка таймаутов и дедлайнов на каждый вызов
  • Балансировка нагрузки на уровне соединений (через Envoy/Istio).
  • Сжатие сообщений для экономии трафика

Балансировка и Service Mesh

Проблема gRPC — долгоживущие соединения. Простое round-robin по TCP не работает эффективно. Решения:

  • L7-прокси (Envoy, Istio, Linkerd),
  • service mesh для маршрутизации и ретраев,
  • клиентская балансировка через gRPC-Load Balancing.

В системах gRPC часто завязан на mesh-инфраструктуру.

Безопасность в gRPC

gRPC изначально ориентирован на защищённые каналы:

  • TLS по умолчанию — все соединения зашифрованы;
  • mTLS — взаимная аутентификация сервисов (не только клиент проверяет сервер, но и сервер проверяет клиента);
  • Метаданные — передача токенов (JWT, OAuth2, API-ключи). ;
  • Интерсепторы ("перехватчики") — проверка прав доступа (сервер может проверять для каждого метода), логирование, метрики;
  • Короткоживущие токены и регулярное обновление сертификатов снижают риск компрометации. Инфраструктура открытых ключей (PKI) управляет жизненным циклом сертификатов.

Мониторинг и отладка

Для gRPC нужны специальные инструменты:

  • Health checking protocol — встроенные проверки для оркестраторов и балансировщиков нагрузки;
  • Метрики производительности — количество вызовов, latency, размеры сообщений, коды ошибок (Prometheus + Grafana);
  • Трассировка — OpenTelemetry для распределённых запросов;
  • Инструменты отладки:
    • grpcurl — CLI-аналог curl;
    • BloomRPC — GUI-клиент для тестирования API.
  • Логирование интерсепторов — для централизованного сбора вызовов и ошибок.

Ограничения и когда НЕ стоит использовать gRPC

  • Браузеры напрямую не поддерживают gRPC (нужен gRPC-web).
  • Для публичных API REST проще (человекочитаемость, отладка).
  • GraphQL лучше для клиентских приложений с гибкими требованиями к данным.
  • В монолитах или простых интеграциях gRPC избыточен.
  • Если нужен текстовый формат сообщений (чтение «на глаз»), REST/JSON предпочтительнее.

Материалы

  1. Введение в gRPC: Основы, применение, плюсы и минусы. Часть I
  2. gRPC - общая информация
  3. gRPC — альтернатива REST API от Google
  4. Что такое gRPC и Protobuf?
  5. Способ организации gRPC контрактов и их автоматизация для микросервисов
  6. Землю — крестьянам, gRPC — питонистам
  7. Сила gRPC в облачных окружениях
  8. gRPC и Protocol Buffers: современный подход к обмену данными между сервисами
  9. Protocol Buffers: самая эффективная бинарная альтернатива текстовому формату
  10. Темная сторона protobuf
  11. Эффективная передача данных: используем Protocol Buffers для коммуникации между ESP32 и QT/QML
  12. gRPC Interceptors (документация)
  13. Перехватчики gRPC в .NET
  14. gRPC — безопасность или жесть?
  15. GRPC в деле: проблемы реального сервиса
  16. Миграция API с REST на gRPC в WePay
  17. Проектирование архитектуры для микросервисов с использованием gRPC
  18. Как я пытался засунуть gRPC в браузер — часть первая
  19. Часть вторая. Как я пытался засунуть gRPC в браузер — продолжение
  20. Секреты интеграции gRPC в Spring Boot
  21. Как перейти на gRPC, сохранив REST
  22. Часть 2: Как я реализовал взаимодействие микросервисов — Kafka и gRpc
  23. Как ClickHouse работает с gRPC: практический пример
  24. gRPCurl — curl для gRPC-серверов

Видео

  1. Что такое RPC и gRPC за 10 минут
  2. Что такое gRPC и Protobuf?
  3. gRPC для новичков
  4. Какие сервисы делать на gRPC? // Демо-занятие курса «Системный аналитик. Advanced»
  5. How Do gRPC Interceptors Work & How To Use Them
  6. Тестирование gRPC и практическое применение BloomRPC
  7. Protobuf: как быстро начать использовать. Его плюсы и минусы, Андрей Советкин
  8. Воркшоп "Внедрение gRPC в проект" | 31.05 | Ozon Route 256
  9. Микросервисы с gRPC [КУРС] - #1 Сервис генерации данных
  10. Микросервисы с gRPC [КУРС] - #2 Сервис чтения и сохранения данных
  11. Микросервисы с gRPC [КУРС] - #3 Сервис аналитики Redis

Книги

Изучаем OpenTelemetry: современный мониторинг систем (2025) - Паркер Остин, Янг Тед