Что такое gRPC?
gRPC (Google Remote Procedure Call) — высокопроизводительный RPC-фреймворк от Google. Использует HTTP/2 для транспорта, Protocol Buffers для сериализации и предоставляет двунаправленный стриминг, контроль потока и встроенную аутентификацию.
gRPC vs. REST
| Характеристика | REST | gRPC |
|---|---|---|
| Протокол | 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
| Код gRPC | HTTP-аналог | Значение |
|---|---|---|
| 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 после настроенного таймаута |
Практическое упражнение
- Установите grpcurl и исследуйте gRPC-сервис.
- Протестируйте все паттерны: unary, server streaming и сценарии ошибок.
- Сравните с REST: Вызовите одну операцию через gRPC и REST. Сравните размер и время.
- Тестирование ошибок: Отправьте невалидные protobuf-сообщения, пропущенные поля и невалидные enum-значения.
Ключевые выводы
- gRPC использует HTTP/2 и Protocol Buffers для высокопроизводительной коммуникации микросервисов
- Proto-файлы определяют строгий контракт API
- Четыре паттерна коммуникации: unary, server streaming, client streaming и bidirectional
- gRPC имеет собственные коды статуса, отличные от HTTP-кодов
- grpcurl — незаменимый инструмент командной строки, аналог cURL для REST