Рабочий вызов на локальном стенде - только начало. В проде нужны безопасность, метрики и корректная остановка.

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.
  • Потоки требуют своих метрик и дедлайнов остановки.