В чем ключевые архитектурные и технические различия между REST API и gRPC?

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

Ответ

REST (Representational State Transfer) — это архитектурный стиль, а не протокол. Он использует HTTP как транспорт и опирается на его методы (GET, POST, PUT, DELETE), статус-коды и концепцию ресурсов (идентифицируемых через URI). Данные обычно передаются в текстовых форматах (JSON, XML).

gRPC (gRPC Remote Procedure Calls) — это современный фреймворк для удаленного вызова процедур (RPC). Он использует HTTP/2 в качестве транспорта и бинарный формат Protocol Buffers (protobuf) по умолчанию для сериализации и определения контракта сервиса.

Сравнительная таблица: Критерий REST (обычно с JSON) gRPC (с Protocol Buffers)
Контракт Неформальный (OpenAPI/Swagger — опционально) Строгий, обязательный .proto файл
Протокол/Транспорт HTTP/1.1 (чаще) HTTP/2 (обязательно)
Формат данных Текстовый (JSON/XML), человекочитаемый Бинарный (protobuf), компактный и быстрый
Парадигма Ориентирована на ресурсы (существительные) Ориентирована на действия/методы (глаголы)
Потоковая передача Ограничена (WebSocket, SSE для push) Встроенная поддержка на уровне HTTP/2:
• Унарный (один запрос - один ответ)
• Серверный поток
• Клиентский поток
• Двунаправленный поток
Производительность Ниже из-за текстового формата и HTTP/1.1 Выше благодаря бинарному protobuf, HTTP/2 и мультиплексированию
Поддержка браузера Полная (fetch, XHR) Ограничена (требуется gRPC-Web и прокси)

Пример определения сервиса в gRPC (.proto файл):

syntax = "proto3";

service UserService {
  rpc GetUser (GetUserRequest) returns (User); // Унарный вызов
  rpc StreamNotifications (NotificationRequest) returns (stream Notification); // Серверный поток
}

message GetUserRequest {
  int32 user_id = 1;
}

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

Когда что выбирать:

  • REST/JSON: Публичные API, веб- и мобильные клиенты, где важна простота интеграции и человекочитаемость.
  • gRPC: Внутренняя коммуникация между микросервисами, среды с высокими требованиями к производительности и задержкам, системы, нуждающиеся в потоковой передаче данных.