util.go
Обзор
Файл util.go содержит утилитную функцию для создания и настройки gRPC-клиентского подключения с поддержкой механизма повторных попыток (retry). Основная задача функции – облегчить установку соединения с gRPC-сервером, обеспечивая при этом надежность вызовов через автоматическую повторную отправку запросов при временных ошибках.
Функциональность файла полезна в распределенных системах и микросервисах, где сетевые сбои или временные неполадки могут приводить к неудачным RPC-вызовам. Использование встроенного механизма повторных попыток снижает необходимость писать подобную логику в каждом клиентском сервисе.
Подробное описание
Функция GetGRPCConnection
func GetGRPCConnection(address string) (*grpc.ClientConn, error)
Назначение
Создаёт и возвращает gRPC клиентское подключение к серверу по заданному адресу с преднастройками для повторных попыток и увеличенного максимального размера сообщений.
Параметры
address string— адрес gRPC-сервера, к которому необходимо подключиться. Обычно в формате"host:port".
Возвращаемые значения
*grpc.ClientConn— указатель на объект клиентского соединения gRPC.error— ошибка, если соединение не удалось установить.
Описание работы
Конфигурируются опции повторных попыток:
Максимум 3 попытки.
Линейный бэкофф с задержкой 1 секунда между попытками.
Создаются Unary и Stream интерсепторы, которые оборачивают вызовы клиента и реализуют логику повторных попыток.
Устанавливаются максимальные размеры сообщений на прием и отправку — по 100 МБ, что позволяет работать с большими payload.
Включается небезопасное транспортное соединение (без TLS) через
insecure.NewCredentials(). Это удобно для локальной разработки или доверенных сетей.Собираются все опции и вызывается
grpc.NewClient()для создания соединения.
Пример использования
conn, err := utils.GetGRPCConnection("localhost:50051")
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer conn.Close()
// Создаем клиент и вызываем методы сервиса
client := pb.NewMyServiceClient(conn)
response, err := client.MyMethod(context.Background(), &pb.MyRequest{})
if err != nil {
log.Printf("RPC call failed: %v", err)
}
Важные детали реализации
Используется пакет
grpc_retryизgrpc-ecosystem/go-grpc-middleware, который расширяет стандартный gRPC клиент функционалом автоматических повторных попыток.Повторные попытки ограничены тремя, что помогает избежать бесконечных циклов при критических ошибках.
Линейная задержка в 1 секунду между попытками — простой и предсказуемый механизм бэкоффа, который можно при необходимости заменить на экспоненциальный.
Максимальный размер сообщения увеличен до 100 МБ — это важно для приложений, работающих с большими данными (например, видео, большие JSON).
Используется небезопасное соединение — в продакшене рекомендуется заменить на TLS-сертификаты.
Взаимодействие с другими частями системы
Функция
GetGRPCConnectionпредназначена для использования в любом клиентском модуле, который должен установить соединение с gRPC-сервером.Может применяться в микросервисной архитектуре для унификации способа подключения к внешним сервисам.
Так как функция возвращает стандартный
*grpc.ClientConn, она совместима со всеми сгенерированными gRPC-клиентами.Важно, чтобы вызов и управление жизненным циклом соединения (вызов
Close()) осуществлялись на стороне вызывающего кода.
Mermaid диаграмма
Ниже представлена диаграмма в формате flowchart, отображающая основные функции и их связи в файле util.go:
flowchart TD
A[GetGRPCConnection(address)] --> B[Настройка retry опций]
B --> C[Создание Unary Interceptor с retry]
B --> D[Создание Stream Interceptor с retry]
C --> E[Формирование grpc.DialOption для Unary]
D --> F[Формирование grpc.DialOption для Stream]
E & F --> G[Установка MaxCallRecvMsgSize и MaxCallSendMsgSize]
G --> H[Добавление insecure транспортных credentials]
H --> I[Вызов grpc.NewClient с опциями]
I --> J[Возврат *grpc.ClientConn или error]
Данная документация позволит быстро понять назначение и использование данного файла, а также поможет внедрить функцию в проект с минимальными затратами времени.