Рабочий вызов на локальном стенде - только начало. В проде нужны безопасность, метрики и корректная остановка.
TLS и mTLS
TLS защищает транспорт, mTLS дополнительно проверяет клиентский сертификат. insecure.NewCredentials остаётся только для локального стенда.
Секреты получают из хранилища, а не из образа. Ротация сертификатов не должна требовать изменения бизнес-кода.
Метрики
HTTP-статус почти всегда 200, поэтому метрики собирают по grpc-status: код, метод, длительность, ошибки и активные потоки. Отдельно смотрят дедлайны, отмены и число Unavailable.
Для потоков нужны число сообщений, их размер, возраст самого старого и скорость чтения/записи. Это помогает увидеть медленного получателя.
Остановка
GracefulStop прекращает новые вызовы и ждёт текущие. У остановки есть дедлайн, чтобы не зависнуть на долгих стримах. После него Stop принудительно закрывает оставшиеся.
Порядок: перестать принимать новые вызовы, отменить активные через контекст, дождаться их завершения, закрыть слушатели и клиентские соединения.
Health checks
Стандартный health service регистрируется рядом с бизнес-сервисом:
healthServer := health.NewServer()
healthpb.RegisterHealthServer(server, healthServer)
healthServer.SetServingStatus("orders.v1.OrderService", healthpb.HealthCheckResponse_SERVING)
liveness отвечает, жив ли процесс. readiness проверяет, можно ли слать трафик: доступна ли база, не заблокированы ли обязательные миграции и можно ли начать consumer. Внешние зависимости проверяют с коротким дедлайном, иначе health check сам станет причиной перегрузки.
При остановке статус меняют на NOT_SERVING до GracefulStop: балансировщик успевает убрать под из rotation. Пулы соединений закрывают после завершения вызовов, а не раньше.
Коротко
- TLS настраивается из секретов, mTLS проверяет и клиента.
- Метрики считают по gRPC-кодам, не по HTTP-статусу.
GracefulStopждёт вызовы ограниченное время, затемStop.- Потоки требуют своих метрик и дедлайнов остановки.