Введение в gRPC

Gennady Karev
Mad Devs — блог об IT
3 min readMar 30, 2017

--

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

gRPC простой в использовании, отлично подходит для создания распределенных систем (микросервисов) и API. Имеет встроенную поддержку для балансировки нагрузки, трассировки, аутентификации и проверки жизнеспособности сервисов. Есть возможность создавать клиентские библиотеки для работы с бэкендом на 10 языках. Высокая производительность достигается за счет использования протокола HTTP/2 и Protocol Buffers.

Protocol Buffers (protobuf)

Protobuf формат сериализации используемый по умолчанию для передачи данных между клиентом и сервером. Используя строгую типизацию полей и бинарный формат для передачи структурированных данных потребляет меньше ресурсов. Время выполнения процесса сериализации/десериализации значительно меньше как и размер сообщений в отличии от JSON/XML.

Для написания protobuf файлов используют язык описания интерфейсов (IDL). Например, чтобы описать структуру данных сообщения, нужно добавить message, имя структуры, а внутри тип, название и номер поля. Номера полей очень важны для обратной совместимости, поэтому не стоит менять их последовательность при добавлении или удалении полей. Старые номера можно резервировать. Пример profile.proto

message Profile {
reserved 3; // Резервируем поле под номером 3
int32 id = 1;
string name = 2;
int32 age = 4;
string email = 5;
enum PhoneType {
MOBILE = 0; // Поле 0 является значением по умолчанию
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}

repeated PhoneNumber phones = 6;
}

Типы RPC

  • Унарный (Unary RPC). Синхронный запрос клиента, который блокируются пока не будет получен ответ от сервера.
  • Серверный стрим (Server streaming RPC), при подключении клиента сервер открывает стрим и начинает отправлять сообщения.
  • Клиентский стрим (Client streaming RPC). То же самое, что и серверный, только клиент начинает стримить сообщения на сервер.
  • Двунаправленный стрим (Bidirectional streaming). Клиент инициализирует соединение, создаются два стрима. Сервер может отправить изначальные данные при подключении или отвечать на каждый запрос клиента по типу “пинг-понга”.

Перехватчики (Interceptors)

Выступают этакой заменой мидлварям, служат для перехвата вызовов и встраивания необходимых условий. Отлично подходят для логирования запросов, сбора метрик, аутентификации и т.д. Пример подключения логов, мониторинга и аутентификации для всех типов запросов используя пакет go-grpc-middleware:

import "github.com/mwitkow/go-grpc-middleware"

myServer := grpc.NewServer(
grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(loggingStream, monitoringStream, authStream)),
grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(loggingUnary, monitoringUnary, authUnary),
)

Балансировка нагрузки (Load Balancing)

Выполняется на стороне клиента. Клиент использует простой “round-robin” алгоритм для передачи запросов по списку полученному от LB сервера. При желании на стороне LB сервера можно организовать более сложный алгоритм выдачи списка бэкенд сервисов клиенту использую LB политики.

Load Balancing Workflow

Проекты которые уже используют gRPC и полезные ссылки

--

--