RU | EN | DE

1. Dockerize Spring Boot приложение

📄 Dockerfile (multi-stage build):

1. Сборка приложения
FROM maven:3.9.6-eclipse-temurin-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
2. Запуск готового jar
FROM eclipse-temurin:17-jdk
WORKDIR /app
COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

📌 Команды:

docker build -t demo-app .
docker run -p 8080:8080 demo-app

2. Actuator (метрики и мониторинг)

📄 Зависимость:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

📄 Настройки:

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,env,beans
  endpoint:
    health:
      show-details: always

📌 Доступные эндпоинты:

  • /actuator/health → состояние
  • /actuator/info → инфо о приложении
  • /actuator/metrics → метрики (JVM, CPU, heap)
  • /actuator/beans → список бинов

3. Micrometer (метрики для Prometheus/Grafana)

Spring Boot 3 использует Micrometer как универсальный слой метрик.

📄 Зависимость для Prometheus:

<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

📌 Теперь доступно: http://localhost:8080/actuator/prometheus

📄 Метрики:

  • jvm.memory.used
  • system.cpu.usage
  • http.server.requests

📄 Свои метрики:

@Component
@RequiredArgsConstructor
public class CustomMetrics {
    private final MeterRegistry registry;
    @PostConstruct
    public void init() {
        Gauge.builder("app.users.count", () -> 42)
             .description("Количество пользователей")
             .register(registry);
    }
}

4. Centralized Logging (ELK / Loki)

Вариант ELK (Elasticsearch + Logstash + Kibana)

📄 В application.yml:

logging:
  level:
    root: INFO
    com.example: DEBUG
  file:
    name: /var/log/app.log

📌 Логи собирает Logstash → в Elasticsearch → смотришь через Kibana.

Вариант Loki + Grafana

📌 Более лёгкий стек (Promtail → Loki → Grafana).
Spring пишет в stdout, Promtail собирает и передаёт в Loki.

5. CI/CD (GitHub Actions)

📄 .github/workflows/ci.yml:

name: Java CI with Maven
on:
  push:
    branches: [ "main" ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Build with Maven
        run: mvn -B clean verify
      - name: Build Docker image
        run: docker build -t demo-app .

📌 Дальше можно настроить деплой в DockerHub или Kubernetes.

6. Kubernetes (K8s deployment)

📄 deployment.yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
      - name: demo-app
        image: demo-app:latest
        ports:
        - containerPort: 8080

📄 service.yml:

apiVersion: v1
kind: Service
metadata:
  name: demo-app-service
spec:
  type: LoadBalancer
  selector:
    app: demo-app
  ports:
  - port: 80
    targetPort: 8080

7. Обновления без простоя (Zero-Downtime Deploy)

  • Использовать Kubernetes Rolling Updates.

  • Для Spring Boot:

  • graceful shutdown → spring.lifecycle.timeout-per-shutdown-phase=30s.

  • readiness/liveness-пробы через /actuator/health.

8. Best Practices

  • ✅ Используй Actuator + Prometheus/Grafana → мониторинг и алерты.
  • ✅ Храни логи централизованно (ELK/Loki).
  • ✅ Всегда запускай приложение в Docker.
  • ✅ На проде используй Kubernetes или ECS/EKS/GKE.
  • ✅ В CI/CD добавь этапы: test → build → dockerize → deploy.
  • ✅ Настрой health-checks и graceful shutdown.