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 -DskipTests2. Запуск готового 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-app2. 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: 80807. Обновления без простоя (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.