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.