Ответ
REST и gRPC — это архитектурные стили для построения API, но с фундаментально разными подходами.
| Аспект | REST (обычно поверх HTTP/1.1) | gRPC (поверх HTTP/2) |
|---|---|---|
| Контракт | Неформальный, описан в документации (OpenAPI/Swagger). | Строгий, определяется в .proto-файлах. |
| Формат данных | Текстовый (JSON, XML). Человекочитаемый, но объёмный. | Бинарный (Protocol Buffers). Компактный и быстрый. |
| Парадигма | Ресурсо-ориентированная (CRUD над сущностями). | Удалённый вызов процедур (RPC). Клиент вызывает методы на сервере. |
| Производительность | Ниже из-за текстового формата и необходимости парсинга. | Высокая за счёт бинарного формата и встроенной потоковой передачи. |
| Потоковая передача | Эмулируется (WebSockets, Server-Sent Events). | Нативная поддержка однонаправленных и двунаправленных потоков. |
Пример контракта и вызова
REST (HTTP + JSON):
GET /api/v1/users/123
Accept: application/json
{"id": 123, "name": "Alice", "email": "alice@example.com"}
gRPC (.proto файл + вызов):
service UserService {
rpc GetUser (GetUserRequest) returns (User);
}
message GetUserRequest { int32 id = 1; }
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
// Клиентский код
var user = await client.GetUserAsync(new GetUserRequest { Id = 123 });
Когда что выбирать:
- REST: Публичные API, веб-приложения, когда нужна простота, человекочитаемость и кэширование на уровне HTTP.
- gRPC: Внутренняя микросервисная коммуникация, среды с высокими требованиями к производительности и задержкам (например, мобильные приложения, системы реального времени), когда важна строгая типизация и потоковая передача.
Ответ 18+ 🔞
Ну вот смотри, как обычно бывает: сидишь ты такой, проектик пишешь, и тут бац — надо сервисы между собой подружить. И встаёт вечный вопрос: REST или gRPC? А выбор-то, блядь, как между молотом и наковальней — зависит от того, что по рукам получить хочешь.
REST — это как старый добрый трактир. Заходи, кричи «Эй, дайте мне пользователя номер 123!». Тебе в ответ бумажку суют, на которой каракулями написано:
GET /api/v1/users/123
Accept: application/json
И приносят тебе вот эту простыню:
{"id": 123, "name": "Alice", "email": "alice@example.com"}
Всё открыто, всё понятно, любой браузер это схавает. Но проблема в том, что каждый раз эту простыню надо разворачивать, читать, парсить — а это время, блядь! И бензина (то есть трафика) она жрёт дохуя, особенно когда данных много.
А теперь представляй gRPC. Это не трактир, а, блядь, высокоскоростная железная дорога с своими правилами. Сначала ты инженер-путеец — пишешь чертёж, как всё будет ездить. Этот чертёж — .proto файл:
service UserService {
rpc GetUser (GetUserRequest) returns (User);
}
message GetUserRequest { int32 id = 1; }
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
Затем ты садишься в поезд (клиент) и просто нажимаешь кнопку:
var user = await client.GetUserAsync(new GetUserRequest { Id = 123 });
И поезд, ёпта, несётся по рельсам HTTP/2 не с текстом, а с бинарными данными (Protocol Buffers). Никаких лишних слов, всё упаковано плотно, как селёдка в бочке. Скорость — огонь, трафика — капля. А ещё он умеет в потоки: можно не просто один запрос-ответ, а целую ленту данных в обе стороны гнать, как по конвейеру.
Так когда что брать?
- Тащишь REST, когда делаешь публичное API для всех подряд. Когда твоим клиентам будет проще ткнуть в браузер или накидать запросов curl'ом. Когда кэширование на уровне HTTP — это святое. Когда человекочитаемость важнее, чем наносекунды.
- Врубаешь gRPC на полную, когда у тебя внутри своего замкнутого мирка микросервисы друг с другом шепчутся. Когда производительность и низкие задержки — это вопрос выживания, как в мобилках или реальном времени. Когда хочется, чтобы контракт был строгий и компилятор ругался матом на неправильные типы ещё до запуска. И когда нужны эти самые потоковые плюшки — вот это сила.
Короче, если делать API для внешнего мира — иди по протоптанной REST-тропе. А если бьёшься за производительность внутри своей экосистемы — gRPC тебе в руки, чувак. Только не перепутай, а то потом будешь из JSON'а в бинарник костыли пилить, волосы на жопе рвать.