Что такое gRPC и каковы его основные принципы работы?

Ответ

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

Ключевые принципы и особенности:

  1. Использует HTTP/2: В отличие от REST поверх HTTP/1.1, gRPC работает на HTTP/2, что дает:

    • Мультиплексирование множества запросов в одном TCP-соединении.
    • Бинарный протокол (более компактный и быстрый, чем текстовый JSON).
    • Двунаправленная потоковая передача.
  2. Использует Protocol Buffers (protobuf) по умолчанию:

    • Язык описания интерфейсов (IDL): Сервисы и структуры сообщений определяются в .proto-файлах.
    • Эффективная бинарная сериализация: Protobuf намного быстрее и меньше по размеру, чем JSON/XML.
    • Генерация кода: Утилита protoc генерирует клиентский и серверный код на многих языках из .proto-файла.
  3. Четыре типа вызовов:

    • Унарный (Unary): Один запрос — один ответ.
    • Серверный поток (Server streaming): Один запрос — поток ответов.
    • Клиентский поток (Client streaming): Поток запросов — один ответ.
    • Двунаправленный поток (Bidirectional streaming): Поток запросов — поток ответов.

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

syntax = "proto3";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
  string name = 1;
}
message HelloReply {
  string message = 1;
}

gRPC идеально подходит для внутренней коммуникации между микросервисами, где важны низкая задержка и высокая пропускная способность.

Ответ 18+ 🔞

Давай разберём эту вашу модульную хуйню под названием gRPC, а то смотрю, народ путается в простых вещах, как мартышка в апельсинах.

В общем, представь себе, что у тебя есть два сервиса. Один, допустим, сидит на одном сервере и орёт: «Эй, дай мне данные пользователя!». А другой, на другом конце света, в облаке каком-нибудь, должен ему эти данные выдать. Раньше для этого использовали REST — это как общаться телеграммами через почтальона Печкина: написал JSON, отправил, ждёшь, пока он дойдёт, прочитают, ответ напишут, обратно пришлют. Медленно, блядь, и бумаги (то бишь, данных) дохуя.

А тут пришли ребята из Google, почесали репу и выкатили gRPC. Это как если бы твои сервисы общались не письмами, а по сверхсекретной, ебанной, прямой видеосвязи.

Вот на чём весь сыр-бор горит:

  1. Он ездит на HTTP/2. Это не тот старый, раздолбанный HTTP/1.1, который один запрос — один ответ, как в очереди за колбасой. HTTP/2 — это восьмиполосная магистраль. Можно кучу запросов в одну трубу запихнуть (мультиплексирование), общаться бинарными данными (не текстом, а сжатыми байтиками, что быстрее), и главное — можно стримить туда-сюда данные, как водопад. Один сказал — много ответов получил, или много сказал — один итоговый ответ.

  2. Любит он Protobuf. Это вообще, блядь, гениальная вещь. Вместо того чтобы городить эти бесконечные JSON'ы с кавычками и запятыми, ты описываешь структуру данных один раз на специальном языке, в файле .proto. Выглядит это чётко и ясно, как инструкция к стиралке.

    Вот смотри, пример, как ты описываешь, что хочешь поздороваться:

    syntax = "proto3";
    service Greeter {
      rpc SayHello (HelloRequest) returns (HelloReply);
    }
    message HelloRequest {
      string name = 1;
    }
    message HelloReply {
      string message = 1;
    }

    Потом берёшь волшебную утилиту protoc, тычешь в неё этот файл и говоришь: «На, сгенерируй мне код на Go/Python/Java (нужное подчеркнуть)». И она тебе выдает готовые классы и функции для клиента и сервера. Никакого ручного разбора JSON'ов! Всё строго, по контракту. Объебешься — код не скомпилируется. Красота!

  3. А сценарии общения у него — вообще песня. Их аж четыре вида:

    • Простой (Unary): Спросил — получил ответ. Старая добрая схема.
    • Стрим от сервера (Server streaming): Ты один раз спросил: «Ну что там?», а сервер тебе в ответ начинает лить поток данных, как из бочки: «Держи! И это держи! И вот это ещё!».
    • Стрим от клиента (Client streaming): Это когда ты долго и нудно загружаешь на сервер кучу данных (например, большой файл кусками), а в конце он тебе говорит: «Ок, всё принял, отъебись».
    • Двусторонний стрим (Bidirectional streaming): Это полный пиздец и мощь одновременно. Оба могут говорить и слушать одновременно, как в нормальном разговоре. Идеально для чатов, онлайн-игр или всяких реальных-time дашбордов.

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