Что такое gRPC?

gRPC (Google Remote Procedure Call) — высокопроизводительный RPC-фреймворк от Google. Использует HTTP/2 для транспорта, Protocol Buffers для сериализации и предоставляет двунаправленный стриминг, контроль потока и встроенную аутентификацию.

gRPC vs. REST

ХарактеристикаRESTgRPC
ПротоколHTTP/1.1 или HTTP/2Только HTTP/2
ФорматJSON (текст)Protobuf (бинарный)
КонтрактОпциональный (OpenAPI)Обязательный (.proto)
СтримингОграниченный (WebSocket)Встроенный (4 паттерна)
Генерация кодаОпциональнаяВстроенная
ПроизводительностьХорошаяОтличная (в 2-10 раз быстрее)
ПрименениеПубличные API, вебМикросервисы, мобильные

Protocol Buffers

.proto файлы определяют контракт API:

syntax = "proto3";
package user;

service UserService {
  rpc GetUser (GetUserRequest) returns (User);
  rpc ListUsers (ListUsersRequest) returns (ListUsersResponse);
  rpc CreateUser (CreateUserRequest) returns (User);
  rpc StreamUpdates (StreamRequest) returns (stream UserUpdate);
}

message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
  Role role = 4;
}

enum Role {
  UNKNOWN = 0;
  ADMIN = 1;
  USER = 2;
}

Ключевые концепции Protobuf

  • Номера полей используются в бинарном формате — никогда их не меняйте
  • Значения по умолчанию — пустые строки, ноль, false (нет концепции null)
  • Обратная совместимость — добавляйте новые поля с новыми номерами

Паттерны коммуникации gRPC

Unary RPC: Один запрос, один ответ

Server Streaming: Один запрос, поток ответов

Client Streaming: Поток запросов, один ответ

Bidirectional Streaming: Оба стримят одновременно

Тестирование gRPC-сервисов

Использование grpcurl

# Список сервисов
grpcurl -plaintext localhost:50051 list

# Вызов метода
grpcurl -plaintext -d '{"id": 42}' \
  localhost:50051 user.UserService/GetUser

# С метаданными (заголовками)
grpcurl -plaintext \
  -H "Authorization: Bearer token123" \
  -d '{"name": "Alice", "email": "alice@example.com"}' \
  localhost:50051 user.UserService/CreateUser

Использование Postman

Postman поддерживает gRPC-тестирование с 2022: создайте gRPC-запрос, импортируйте .proto, выберите метод и вызовите.

Коды статуса gRPC

Код gRPCHTTP-аналогЗначение
OK (0)200Успех
INVALID_ARGUMENT (3)400Невалидный запрос
NOT_FOUND (5)404Не найдено
ALREADY_EXISTS (6)409Конфликт
PERMISSION_DENIED (7)403Запрещено
UNAUTHENTICATED (16)401Не аутентифицирован
INTERNAL (13)500Ошибка сервера

Тесты стриминга

ТестЧто проверять
Отмена стримаКлиент может отменить на середине
Пустой стримСервер корректно возвращает ноль сообщений
Большой стримПроизводительность с тысячами сообщений
Ошибка посерединеКорректная обработка ошибок с обеих сторон
Таймаут стримаDEADLINE_EXCEEDED после настроенного таймаута

Практическое упражнение

  1. Установите grpcurl и исследуйте gRPC-сервис.
  2. Протестируйте все паттерны: unary, server streaming и сценарии ошибок.
  3. Сравните с REST: Вызовите одну операцию через gRPC и REST. Сравните размер и время.
  4. Тестирование ошибок: Отправьте невалидные protobuf-сообщения, пропущенные поля и невалидные enum-значения.

Ключевые выводы

  • gRPC использует HTTP/2 и Protocol Buffers для высокопроизводительной коммуникации микросервисов
  • Proto-файлы определяют строгий контракт API
  • Четыре паттерна коммуникации: unary, server streaming, client streaming и bidirectional
  • gRPC имеет собственные коды статуса, отличные от HTTP-кодов
  • grpcurl — незаменимый инструмент командной строки, аналог cURL для REST