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

«В чем разница между REST API и gRPC?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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: Внутренняя микросервисная коммуникация, среды с высокими требованиями к производительности и задержкам (например, мобильные приложения, системы реального времени), когда важна строгая типизация и потоковая передача.