gRPC

Базовый System Design
≈ 2 мин чтения

RPC с явным контрактом

gRPC позволяет описать сервис и его сообщения в файле Protocol Buffers, а затем сгенерировать клиентский и серверный код для выбранных языков. Клиент вызывает удалённую операцию через типизированный stub вместо ручной сборки HTTP-запроса.

syntax = "proto3";

service UserService {
  rpc GetUser (GetUserRequest) returns (UserReply);
}

message GetUserRequest {
  int64 id = 1;
}

message UserReply {
  int64 id = 1;
  string name = 2;
}

Контракт используется для генерации кода

Из одного .proto файла инструменты создают классы сообщений и интерфейсы вызова. Это уменьшает количество ручного кода сериализации и помогает обнаруживать несовместимые изменения раньше.

gRPC обычно передаёт бинарные Protocol Buffers поверх HTTP/2. Сообщения компактны, а постоянное соединение хорошо подходит для частых внутренних вызовов между сервисами.

Не только один запрос — один ответ

Помимо обычного unary-вызова gRPC поддерживает потоковую передачу сообщений от сервера, от клиента или в обе стороны. Это полезно, когда данные естественно приходят последовательностью и не хочется создавать отдельный HTTP-запрос на каждый элемент.

gRPC особенно удобен внутри контролируемой инфраструктуры. Для публичного браузерного API REST часто проще, а для интенсивного межсервисного RPC типизированный контракт gRPC может быть удобнее и эффективнее.