← Назад к вопросам

Что такое gRPC?

1.3 Junior🔥 101 комментариев
#Сети и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

gRPC: Высокопроизводительная система удалённого вызова процедур

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

Ключевые характеристики gRPC

1. Протокол передачи: HTTP/2

  • Мультиплексирование — одновременная передача множества потоков по одному соединению
  • Бинарный формат — компактнее текстовых данных (JSON, XML)
  • Сжатие заголовков — уменьшает overhead
  • Server push — сервер может инициировать отправку данных

2. Сериализация: Protocol Buffers (protobuf) Бинарный формат вместо JSON:

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

message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}

Преимущества protobuf:

  • Компактный размер (меньше JSON в 3-10 раз)
  • Быстрая сериализация/десериализация
  • Строгая типизация
  • Обратная совместимость при эволюции схемы

Типы RPC в gRPC

1. Unary RPC — один запрос, один ответ (классический вызов):

stub->SayHello(request, &response);

2. Server Streaming — один запрос, множество ответов:

std::unique_ptr<grpc::ClientReader<HelloReply>> reader(
    stub->GetMessages(&context, request));
HelloReply reply;
while (reader->Read(&reply)) {
    std::cout << reply.message() << std::endl;
}

3. Client Streaming — множество запросов, один ответ:

std::unique_ptr<grpc::ClientWriter<HelloRequest>> writer(
    stub->SayHellos(&context, &reply));
for (int i = 0; i < 10; ++i) {
    HelloRequest request;
    request.set_name("client");
    writer->Write(request);
}
writer->WritesDone();

4. Bidirectional Streaming — множество запросов и ответов одновременно:

std::shared_ptr<grpc::ClientReaderWriter<HelloRequest, HelloReply>> stream(
    stub->Chat(&context));

std::thread write_thread([&stream]() {
    HelloRequest request;
    for (int i = 0; i < 10; ++i) {
        request.set_name("client");
        stream->Write(request);
    }
    stream->WritesDone();
});

HelloReply reply;
while (stream->Read(&reply)) {
    std::cout << reply.message() << std::endl;
}
write_thread.join();

Пример сервера на C++

#include <grpcpp/grpcpp.h>
#include "helloworld.grpc.pb.h"

class GreeterServiceImpl : public helloworld::Greeter::Service {
    grpc::Status SayHello(grpc::ServerContext* context,
                          const helloworld::HelloRequest* request,
                          helloworld::HelloReply* reply) override {
        reply->set_message("Hello " + request->name());
        return grpc::Status::OK;
    }
};

int main() {
    std::string server_address("0.0.0.0:50051");
    GreeterServiceImpl service;
    
    grpc::ServerBuilder builder;
    builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
    builder.RegisterService(&service);
    
    std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
    std::cout << "Server listening on " << server_address << std::endl;
    server->Wait();
    
    return 0;
}

Преимущества gRPC

  • Производительность — HTTP/2 + protobuf быстрее REST/JSON в 7-10 раз
  • Низкая задержка — идеально для микросервисной архитектуры
  • Bidirectional streaming — реал-тайм коммуникация
  • Language-agnostic — работает с C++, Java, Python, Go, Node.js и т.д.
  • Встроенная аутентификация — TLS/SSL из коробки
  • Load balancing — встроенный механизм

Недостатки и ограничения

  • Не подходит для браузеров (требуется gRPC-Web)
  • Сложнее отладки — бинарный протокол vs текстовый JSON
  • Крутая кривая обучения — protobuf, code generation
  • Не REST — нарушает HTTP semantics

Когда использовать gRPC

✓ Микросервисная архитектура
✓ Высоконагруженные системы
✓ Real-time streaming приложения
✓ IoT и мобильные приложения
✗ Public APIs (используй REST/GraphQL)
✗ Браузерные приложения (используй gRPC-Web)

gRPC — это индустриальный стандарт для inter-service communication в modern backend системах.