3. gRPC Gateway — REST-прокси для совместимости
Хотя gRPC эффективен, не все клиенты умеют с ним работать напрямую (например, браузеры без gRPC-Web).
Чтобы не дублировать API, используется gRPC Gateway — это HTTP-прокси, который преобразует REST-запросы в gRPC-вызовы.
Как это работает
Клиент делает обычный HTTP-запрос (GET, POST, PUT).
Gateway принимает запрос и преобразует его в бинарный gRPC-вызов.
Сервер gRPC обрабатывает его и возвращает ответ.
Gateway обратно конвертирует ответ в JSON.
Файл .proto содержит специальные аннотации:
Так создаётся REST-эндпоинт /v1/cars/{id}, который вызывает gRPC-метод GetCar.
gRPC Gateway позволяет сохранять одну кодовую базу и одну схему, но обслуживать и gRPC-, и REST-клиентов одновременно.
4. Балансировка нагрузки и мониторинг
gRPC поддерживает client-side load balancing, когда клиент сам выбирает, к какому серверу подключаться, используя список адресов.
Это особенно важно для микросервисов, где количество экземпляров сервиса динамически меняется.
Поддерживаются различные политики: round-robin, pick-first, weighted.
В Kubernetes это можно комбинировать с сервис-дискавери (через DNS или Consul).
Для продакшена жизненно важно собирать метрики.
gRPC интегрируется с Prometheus, OpenTelemetry, Zipkin, Jaeger для трассировки и мониторинга.
Через interceptors можно логировать время ответа, коды ошибок и нагрузку:
Трассировка (tracing) позволяет увидеть цепочку вызовов между микросервисами — от клиента до базы данных.
5. Совместимость версий и эволюция схем
Когда сервисы растут, .proto-файлы меняются.
Важно, чтобы новые версии клиента и сервера могли работать вместе без сбоев.
Для этого protobuf предоставляет правила совместимости.
Основные правила миграции
Не менять номера полей.
Каждое поле в message имеет уникальный номер, и именно он используется при сериализации.
Изменить имя поля можно, номер — нельзя.
Резервировать удалённые поля.
Если поле больше не используется, его нужно “зарезервировать”:
Это защищает от случайного переиспользования номеров или имён.
Добавлять новые поля безопасно.
Клиенты старых версий просто игнорируют незнакомые поля, сохраняя обратную совместимость.
Не менять тип данных существующих полей.
Например, int32 нельзя заменить на string.
Версионирование API
Часто версии отражаются в пакетах или namespace:
Так можно постепенно внедрять новые контракты без нарушения старых клиентов.
6. Как всё выглядит в продакшене
Реальная система на gRPC обычно включает:
Сервер с набором interceptor’ов (логирование, метрики, безопасность).
TLS-сертификаты и JWT-аутентификацию.
Балансировку через Kubernetes или сервис-дискавери.
Мониторинг и трассировку через OpenTelemetry.
gRPC Gateway для REST-клиентов.
CI/CD-пайплайн, генерирующий код по .proto и публикующий артефакты для разных языков.
#Java #middle #gRPC #proto
Хотя gRPC эффективен, не все клиенты умеют с ним работать напрямую (например, браузеры без gRPC-Web).
Чтобы не дублировать API, используется gRPC Gateway — это HTTP-прокси, который преобразует REST-запросы в gRPC-вызовы.
Как это работает
Клиент делает обычный HTTP-запрос (GET, POST, PUT).
Gateway принимает запрос и преобразует его в бинарный gRPC-вызов.
Сервер gRPC обрабатывает его и возвращает ответ.
Gateway обратно конвертирует ответ в JSON.
Файл .proto содержит специальные аннотации:
import "google/api/annotations.proto";
service CarService {
rpc GetCar(GetCarRequest) returns (CarResponse) {
option (google.api.http) = {
get: "/v1/cars/{id}"
};
}
}
Так создаётся REST-эндпоинт /v1/cars/{id}, который вызывает gRPC-метод GetCar.
gRPC Gateway позволяет сохранять одну кодовую базу и одну схему, но обслуживать и gRPC-, и REST-клиентов одновременно.
4. Балансировка нагрузки и мониторинг
gRPC поддерживает client-side load balancing, когда клиент сам выбирает, к какому серверу подключаться, используя список адресов.
Это особенно важно для микросервисов, где количество экземпляров сервиса динамически меняется.
Поддерживаются различные политики: round-robin, pick-first, weighted.
В Kubernetes это можно комбинировать с сервис-дискавери (через DNS или Consul).
ManagedChannel channel = ManagedChannelBuilder
.forTarget("dns:///my-grpc-service.default.svc.cluster.local")
.defaultLoadBalancingPolicy("round_robin")
.usePlaintext()
.build();
Для продакшена жизненно важно собирать метрики.
gRPC интегрируется с Prometheus, OpenTelemetry, Zipkin, Jaeger для трассировки и мониторинга.
Через interceptors можно логировать время ответа, коды ошибок и нагрузку:
long start = System.nanoTime();
RespT response = next.startCall(call, headers);
long duration = System.nanoTime() - start;
metrics.recordLatency(duration);
Трассировка (tracing) позволяет увидеть цепочку вызовов между микросервисами — от клиента до базы данных.
5. Совместимость версий и эволюция схем
Когда сервисы растут, .proto-файлы меняются.
Важно, чтобы новые версии клиента и сервера могли работать вместе без сбоев.
Для этого protobuf предоставляет правила совместимости.
Основные правила миграции
Не менять номера полей.
Каждое поле в message имеет уникальный номер, и именно он используется при сериализации.
Изменить имя поля можно, номер — нельзя.
Резервировать удалённые поля.
Если поле больше не используется, его нужно “зарезервировать”:
message Car {
reserved 4, 6 to 8;
reserved "old_model", "legacy_color";
}Это защищает от случайного переиспользования номеров или имён.
Добавлять новые поля безопасно.
Клиенты старых версий просто игнорируют незнакомые поля, сохраняя обратную совместимость.
Не менять тип данных существующих полей.
Например, int32 нельзя заменить на string.
Версионирование API
Часто версии отражаются в пакетах или namespace:
package car.v1;
service CarService { ... }
package car.v2;
service CarService { ... }
Так можно постепенно внедрять новые контракты без нарушения старых клиентов.
6. Как всё выглядит в продакшене
Реальная система на gRPC обычно включает:
Сервер с набором interceptor’ов (логирование, метрики, безопасность).
TLS-сертификаты и JWT-аутентификацию.
Балансировку через Kubernetes или сервис-дискавери.
Мониторинг и трассировку через OpenTelemetry.
gRPC Gateway для REST-клиентов.
CI/CD-пайплайн, генерирующий код по .proto и публикующий артефакты для разных языков.
#Java #middle #gRPC #proto
👍2