Gymterview
middle

Как организовать деплой микросервисов?

Развёртывание микросервисов требует зрелых CI/CD практик и стратегий, минимизирующих риски. Основные стратегии: Blue-Green, Canary и Rolling Update.

Стратегии развёртывания

Стратегия Принцип Плюсы Минусы
Blue-Green 100% переключение между двумя окружениями Мгновенный откат Двойные ресурсы
Canary Постепенное увеличение трафика (5% → 25% → 100%) Раннее обнаружение проблем Сложнее настроить
Rolling Update Постепенная замена pod’ов Стандарт в Kubernetes Медленный откат
Rolling Update в Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-service
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Создать 1 новый pod перед удалением старого
      maxUnavailable: 0   # Не допускать недоступности
  template:
    spec:
      containers:
        - name: payment-service
          image: bank-registry/payment-service:2.0
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8080
            initialDelaySeconds: 20
            periodSeconds: 5

CI/CD Pipeline для микросервиса

Пример
stages:
  - build       # Maven build + unit tests
  - test        # Integration tests + Contract tests
  - scan        # SonarQube + SAST/DAST + License compliance
  - package     # Docker build + push to registry
  - deploy-dev  # Deploy to dev
  - deploy-stage # Deploy to staging + E2E tests
  - deploy-prod # Canary → Rolling update to production

Graceful Shutdown – корректное завершение при обновлении

Конфигурация graceful shutdown
# application.yml
server:
  shutdown: graceful
spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s

# Kubernetes
spec:
  terminationGracePeriodSeconds: 60
  containers:
    - lifecycle:
        preStop:
          exec:
            command: ["sh", "-c", "sleep 10"]  # Даём время LB убрать pod из ротации
// Обработка graceful shutdown для Kafka consumer
@PreDestroy
public void onShutdown() {
    log.info("Получен сигнал завершения. Останавливаем обработку сообщений...");
    kafkaListenerEndpointRegistry.stop();
    // Дожидаемся завершения текущих операций
}

Рекомендации

  • Каждый сервис деплоится независимо, со своим пайплайном.
  • Обязательные этапы: сканирование безопасности (SAST/DAST), проверка лицензий.
  • Feature flags (Unleash, LaunchDarkly) для безопасного включения новых функций.
  • Автоматический rollback при деградации метрик.
  • Чёткая процедура согласования релизов (change management).

На собеседовании: знайте три стратегии деплоя и когда какую использовать. Обязательно упомяните graceful shutdown и readiness probes — без них rolling update будет терять запросы. Частая ошибка — забыть про preStop hook в Kubernetes.