В чем разница между REST API и gRPC?

Ответ

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'а в бинарник костыли пилить, волосы на жопе рвать.