Что такое gRPC и чем он отличается от REST?

Ответ

gRPC (Google Remote Procedure Call) — это современный, высокопроизводительный фреймворк с открытым исходным кодом для удаленного вызова процедур (RPC), разработанный Google.

Он использует Protocol Buffers (Protobuf) в качестве языка описания интерфейсов (IDL) для определения структуры данных и сервисных контрактов. Данные передаются в бинарном формате, что делает его очень эффективным.

Ключевые особенности gRPC:

  • Строгая типизация и контракты: Сервисы и сообщения строго определяются в .proto файлах. Это исключает ошибки несоответствия данных.
  • Высокая производительность: Использует HTTP/2, который поддерживает мультиплексирование (множество запросов в одном соединении), сжатие заголовков и бинарную сериализацию Protobuf.
  • Кодогенерация: Автоматически генерирует типизированный клиентский и серверный код на множестве языков (Go, Java, Python, C++ и др.).
  • Стриминг (потоковая передача): Встроенная поддержка унарных, серверных, клиентских и двунаправленных потоков данных.

Пример .proto файла:

// Версия синтаксиса
syntax = "proto3";

// Определение сервиса
service Greeter {
  // RPC-метод: принимает HelloRequest, возвращает HelloReply
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// Структура сообщения запроса
message HelloRequest {
  string name = 1;
}

// Структура сообщения ответа
message HelloReply {
  string message = 1;
}

gRPC vs REST

Характеристика gRPC REST
Протокол HTTP/2 В основном HTTP/1.1 (HTTP/2 возможен)
Формат данных Protocol Buffers (бинарный) JSON (текстовый, человекочитаемый)
Контракт Строгий, .proto файл (IDL) Гибкий, часто описывается через OpenAPI/Swagger
Производительность Очень высокая (бинарный формат, HTTP/2) Ниже (текстовый парсинг, избыточность JSON)
Типизация Строгая, статическая Динамическая, слабая
Стриминг Встроенная поддержка (клиент, сервер, bidi) Реализуется через WebSocket, SSE или long-polling
Браузерная поддержка Ограниченная (требуется прокси, например gRPC-Web) Нативная, полная поддержка

Вывод: gRPC идеально подходит для высокопроизводительных внутренних коммуникаций (микросервисы), где важны скорость и строгие контракты. REST остается отличным выбором для публичных API, где важны простота, человекочитаемость и широкая совместимость с клиентами (особенно браузерами).

Ответ 18+ 🔞

А, слушай, вот эта ваша модная хуйня — gRPC. Ну, типа, удалённый вызов процедур, только от Гугла, чтобы всё было быстро и модно. Представь, что у тебя два сервиса должны поболтать, но так, чтобы не через кривые JSON'ы трястись, а по-взрослому.

Суть в чём, блядь? Берёшь Protocol Buffers — это такой язык, на котором ты пишешь, что и как твои службы будут друг другу передавать. Типа контракт: "чувак, я буду слать тебе строку name, а ты мне в ответ — строку message". И всё это не на русском, а на своём синтаксисе, в файлике .proto.

Вот, смотри, как это выглядит, простой пример:

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Пишешь эту хрень, потом запускаешь кодогенератор — и он тебе, сука, на выбранном языке (Go, Python, Java — да на чём угодно!) выплёвывает готовый, типизированный код и для сервера, и для клиента. Красота же! Никаких ручных парсеров, никаких "ой, а я забыл поле surname добавить". Всё строго, всё по контракту. Не выполнил условия — нахуй с пляжа, компиляция не пройдёт.

А теперь самое сочное — производительность. Вся соль в двух вещах:

  1. HTTP/2. Это не тот старый, тупой HTTP/1.1, где на каждый запрос — новое соединение. Тут одно соединение, и по нему, как по трубе, одновременно летит куча запросов и ответов (мультиплексирование, блядь!). Заголовки сжимаются. В общем, не сравнить.
  2. Protobuf (бинарный формат). Данные не в виде текстового JSON'а, который раздувается и его долго парсить, а в виде компактной бинарной упаковки. Быстро сериализовалось, быстро улетело, быстро принялось. Скорость — просто овердохуищная, особенно для внутреннего общения между микросервисами.

Ну и стриминг, ёпта! Это когда можно не просто "запрос-ответ", а настроить целый поток данных. Сервер может тебе долго и нудно что-то сыпать, клиент может слать данные пачками, или вообще устроить двустороннее общение — всё из коробки, без костылей вроде WebSocket'ов.

А теперь, блядь, главный вопрос: нахуя это всё, если есть старый добрый REST?

Сравниваем, сука:

Признак gRPC REST (типичный)
Протокол HTTP/2 (умный и быстрый) Чаще HTTP/1.1 (старый и дубовый)
Данные Protobuf (бинарный, компактный) JSON (текст, много букв)
Контракт Жёсткий, в .proto (нарушил — всё сломалось) Гибкий, часто "на словах" или в OpenAPI (нарушил — "ой, извините")
Скорость Выше крыши, ебать Скромнее, парсинг JSON'а и лишние байты тормозят
Типизация Строгая, на этапе компиляции Динамическая, "как получится"
Потоки Встроены от и до Через костыли (WebSocket, SSE)
Для браузеров Пиздец, не дружит (нужен gRPC-Web) Родная стихия, все понимают

Итог, Колян: Если у тебя там внутри системы, свои микросервисы друг с другом болтают — gRPC это твой выбор, золотой. Всё быстро, надёжно, по контракту. А если делаешь публичное API для всяких фронтендов или мобилок — тут без вариантов, REST на JSON'е. Его все понимают, с ним проще дебажиться, в конце концов. Каждый инструмент, блядь, для своего дела. Главное — не пытаться gRPC'шным клиентом из браузера пользоваться, а то волосы на жопе вылезут от настройки прокси.