Что такое gRPC

Ответ

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

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

  • Поддержка потоковой передачи (unary, server streaming, client streaming, bidirectional streaming)
  • Кроссплатформенность и поддержка множества языков
  • Встроенные механизмы аутентификации, шифрования и балансировки нагрузки

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

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

C# пример вызова:

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "World" });
Console.WriteLine(reply.Message);

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

Ответ 18+ 🔞

Да ты послушай, что эти умники в Гугле придумали! gRPC, блядь. Ну вроде как старый добрый удалённый вызов процедур, но на стероидах, понимаешь? Не то что эти твои корявые SOAP или REST, которые JSON'ами друг в друга плюются.

Суть-то простая: есть у тебя функция на одном сервере, а вызвать её надо с другого, через сеть. Вот gRPC как раз про это. Только сделано всё с умом, ёпта. Качает данные по HTTP/2 — это уже не тот усатый монстр, а шустрая штука, которая много чего может за раз гонять. А данные эти не в текстовом виде, а в бинарном, через Protocol Buffers. То есть сериализовано всё в мелкие, компактные кусочки. Жрёт мало, а работает быстро — прямо как я на пятничной пьянке.

Чем он вообще хорош, этот зверь:

  • Потоки поддерживает на раз. Можешь запрос-ответ как обычно, можешь сервер тебе потоком данные лить, можешь сам на сервер поток слать, а можешь и вовсе устроить двустороннюю болталку — всё как в жизни.
  • Языков куча. Хочешь на C# пили, хочешь на Go, хочешь на Python — везде найдёшь поддержку, не пропадёшь.
  • С безопасностью и прочей мутью не костыльно, а из коробки. Аутентификация, шифрование, балансировка — не надо велосипед из говна и палок собирать, почти всё есть.

Вот смотри, как это описать. Пишешь себе такой файлик proto:

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

message HelloRequest {
  string name = 1; // вот эта единичка — номер поля, запомни, это важно, а не значение по умолчанию, мудак!
}

message HelloReply {
  string message = 1;
}

Красота же? Читабельно, как два пальца. Говорим: есть сервис Greeter, у него метод SayHello. Кидаешь ему в рот HelloRequest, а он тебе выплёвывает HelloReply. Всё, интерфейс описан. Потом из этого файла код на любом языке сгенерируется — красота, блядь.

Ну а на C# вызов выглядит просто, как тапок:

// Канал к серверу открываем
var channel = GrpcChannel.ForAddress("https://localhost:5001");
// Клиента создаём
var client = new Greeter.GreeterClient(channel);
// И просто хуяк — вызываем, как будто это локальная функция!
var reply = await client.SayHelloAsync(new HelloRequest { Name = "World" });
Console.WriteLine(reply.Message); // "Hello World", ёпта!

Вообще, если у тебя там микросервисы плодятся как тараканы, и они между собой болтают постоянно — это твой выбор, чувак. Нагрузку сетевую снимает конкретно, по сравнению с тем же REST'ом. Просто потому что не таскает туда-сюда кучу текстовых метаданных в заголовках и не жрёт ресурсы на парсинг JSON'а. В общем, вещь, блядь.