d937e82d2b
TODO-Roadmap.md
356 lines
8.8 KiB
Markdown
356 lines
8.8 KiB
Markdown
# Ping Service - Circuit Breaker Demo
|
|
|
|
## ⚠️ Wichtiger Hinweis
|
|
|
|
Dieses Modul (`:temp:ping-service`) ist ein **temporärer Service** ausschließlich für Testzwecke. Seine Aufgabe ist die Validierung der technischen Infrastruktur im Rahmen des **"Tracer Bullet"-Szenarios** und die Demonstration von **Circuit Breaker Patterns**.
|
|
|
|
Nachdem der End-to-End-Test erfolgreich war, sollte dieses Modul in der `settings.gradle.kts` wieder deaktiviert oder vollständig entfernt werden.
|
|
|
|
## 📋 Inhaltsverzeichnis
|
|
|
|
- [Überblick](#überblick)
|
|
- [Architektur & Features](#architektur--features)
|
|
- [API Endpoints](#api-endpoints)
|
|
- [Konfiguration](#konfiguration)
|
|
- [Lokale Entwicklung](#lokale-entwicklung)
|
|
- [Docker Deployment](#docker-deployment)
|
|
- [Testing](#testing)
|
|
- [Monitoring & Health Checks](#monitoring--health-checks)
|
|
- [Troubleshooting](#troubleshooting)
|
|
|
|
## 🎯 Überblick
|
|
|
|
Der `ping-service` ist ein Spring Boot Microservice, der die grundlegende Service-Architektur und moderne Resilience Patterns demonstriert:
|
|
|
|
- **Circuit Breaker Pattern** mit Resilience4j
|
|
- **Service Discovery** mit Spring Cloud Consul
|
|
- **Health Checks** und **Monitoring** mit Spring Boot Actuator
|
|
- **Containerisierte Deployment** mit optimiertem Docker Setup
|
|
- **Comprehensive Testing** mit Integration- und Unit-Tests
|
|
|
|
## 🏗️ Architektur & Features
|
|
|
|
### Technology Stack
|
|
- **Spring Boot 3.2.5** - Modern Java/Kotlin web framework
|
|
- **Kotlin** - Primary programming language
|
|
- **Resilience4j** - Circuit breaker and fault tolerance
|
|
- **Spring Cloud Consul** - Service discovery and configuration
|
|
- **Micrometer + Prometheus** - Metrics collection
|
|
- **Docker** - Containerization with multi-stage builds
|
|
|
|
### Circuit Breaker Configuration
|
|
Der Service verwendet Resilience4j Circuit Breaker mit folgenden Einstellungen:
|
|
- **Failure Rate Threshold**: 60% (Circuit öffnet bei 60% Fehlern)
|
|
- **Minimum Calls**: 4 (Mindestanzahl Calls für Berechnung)
|
|
- **Wait Duration**: 5s (Wartezeit im OPEN Status)
|
|
- **Half-Open Calls**: 3 (Anzahl Calls im HALF_OPEN Status)
|
|
|
|
## 🚀 API Endpoints
|
|
|
|
### 1. Standard Ping Endpoint
|
|
```http
|
|
GET /ping
|
|
```
|
|
**Beschreibung**: Einfacher Ping ohne Circuit Breaker
|
|
**Response**:
|
|
```json
|
|
{
|
|
"status": "pong"
|
|
}
|
|
```
|
|
|
|
### 2. Enhanced Ping mit Circuit Breaker
|
|
```http
|
|
GET /ping/enhanced?simulate=false
|
|
```
|
|
**Beschreibung**: Ping mit Circuit Breaker Schutz
|
|
**Query Parameter**:
|
|
- `simulate` (optional): `true` für Failure-Simulation
|
|
|
|
**Success Response**:
|
|
```json
|
|
{
|
|
"status": "pong",
|
|
"timestamp": "2025-08-14 12:26:30",
|
|
"service": "ping-service",
|
|
"circuitBreaker": "CLOSED"
|
|
}
|
|
```
|
|
|
|
**Fallback Response** (Circuit Breaker OPEN):
|
|
```json
|
|
{
|
|
"status": "fallback",
|
|
"message": "Service temporarily unavailable",
|
|
"timestamp": "2025-08-14 12:26:30",
|
|
"service": "ping-service-fallback",
|
|
"circuitBreaker": "OPEN",
|
|
"error": "Simulated service failure"
|
|
}
|
|
```
|
|
|
|
### 3. Health Check Endpoint
|
|
```http
|
|
GET /ping/health
|
|
```
|
|
**Beschreibung**: Health Check mit Circuit Breaker Status
|
|
|
|
**Response**:
|
|
```json
|
|
{
|
|
"status": "UP",
|
|
"timestamp": "2025-08-14 12:26:30",
|
|
"circuitBreaker": "CLOSED"
|
|
}
|
|
```
|
|
|
|
### 4. Test Failure Endpoint
|
|
```http
|
|
GET /ping/test-failure
|
|
```
|
|
**Beschreibung**: Endpoint zum Testen der Circuit Breaker Funktionalität (60% Failure Rate)
|
|
|
|
## ⚙️ Konfiguration
|
|
|
|
### Application Configuration (`application.yml`)
|
|
```yaml
|
|
spring:
|
|
application:
|
|
name: ping-service
|
|
cloud:
|
|
consul:
|
|
host: localhost
|
|
port: 8500
|
|
discovery:
|
|
register: true
|
|
health-check-path: /actuator/health
|
|
health-check-interval: 10s
|
|
|
|
server:
|
|
port: 8082
|
|
|
|
management:
|
|
endpoints:
|
|
web:
|
|
exposure:
|
|
include: health,info,circuitbreakers
|
|
endpoint:
|
|
health:
|
|
show-details: always
|
|
|
|
resilience4j:
|
|
circuitbreaker:
|
|
instances:
|
|
pingCircuitBreaker:
|
|
failure-rate-threshold: 60
|
|
minimum-number-of-calls: 4
|
|
wait-duration-in-open-state: 5s
|
|
permitted-number-of-calls-in-half-open-state: 3
|
|
```
|
|
|
|
### Environment Variables
|
|
- `SPRING_PROFILES_ACTIVE`: Aktives Spring Profil (default: `default`)
|
|
- `DEBUG`: Enable Debug-Modus (`true`/`false`, Debug Port: 5005)
|
|
- `SERVER_PORT`: Server Port (default: `8082`)
|
|
|
|
## 💻 Lokale Entwicklung
|
|
|
|
### Prerequisites
|
|
- Java 21+
|
|
- Docker (optional)
|
|
- Consul (für Service Discovery)
|
|
|
|
### Service starten
|
|
```bash
|
|
# Standard Start
|
|
./gradlew :temp:ping-service:bootRun
|
|
|
|
# Mit spezifischem Profil
|
|
./gradlew :temp:ping-service:bootRun -Pspring.profiles.active=dev
|
|
|
|
# Build JAR
|
|
./gradlew :temp:ping-service:bootJar
|
|
```
|
|
|
|
### Service testen
|
|
```bash
|
|
# Standard Ping
|
|
curl http://localhost:8082/ping
|
|
|
|
# Enhanced Ping
|
|
curl http://localhost:8082/ping/enhanced
|
|
|
|
# Health Check
|
|
curl http://localhost:8082/ping/health
|
|
|
|
# Circuit Breaker mit Simulation
|
|
curl "http://localhost:8082/ping/enhanced?simulate=true"
|
|
|
|
# Failure Test
|
|
curl http://localhost:8082/ping/test-failure
|
|
```
|
|
|
|
## 🐳 Docker Deployment
|
|
|
|
### Build Docker Image
|
|
```bash
|
|
# Von der Projekt-Root ausführen
|
|
docker build -t ping-service:latest -f temp/ping-service/Dockerfile .
|
|
```
|
|
|
|
### Run Container
|
|
```bash
|
|
# Standard Mode
|
|
docker run -p 8082:8082 ping-service:latest
|
|
|
|
# Debug Mode
|
|
docker run -p 8082:8082 -p 5005:5005 -e DEBUG=true ping-service:latest
|
|
|
|
# Mit Environment Variables
|
|
docker run -p 8082:8082 \
|
|
-e SPRING_PROFILES_ACTIVE=prod \
|
|
-e LOGGING_LEVEL_ROOT=WARN \
|
|
ping-service:latest
|
|
```
|
|
|
|
### Docker Features
|
|
- **Multi-stage Build** für optimale Image-Größe
|
|
- **Non-root User** für bessere Sicherheit
|
|
- **Health Checks** integriert
|
|
- **JVM Optimierungen** für Container-Umgebung
|
|
- **Debug Support** über Environment Variables
|
|
|
|
## 🧪 Testing
|
|
|
|
### Unit Tests ausführen
|
|
```bash
|
|
./gradlew :temp:ping-service:test
|
|
```
|
|
|
|
### Integration Tests
|
|
```bash
|
|
./gradlew :temp:ping-service:integrationTest
|
|
```
|
|
|
|
### Test Coverage
|
|
Der Service enthält umfassende Tests für:
|
|
- **Controller Tests**: API Endpoint Validierung
|
|
- **Circuit Breaker Tests**: Resilience4j Integration
|
|
- **Integration Tests**: End-to-End Scenarios
|
|
- **Health Check Tests**: Actuator Endpoint Validation
|
|
|
|
### Test Klassen
|
|
- `PingControllerTest`: Controller Unit Tests
|
|
- `PingControllerIntegrationTest`: Full Spring Context Tests
|
|
- `PingServiceCircuitBreakerTest`: Circuit Breaker Logic Tests
|
|
|
|
## 📊 Monitoring & Health Checks
|
|
|
|
### Actuator Endpoints
|
|
- **Health**: `GET /actuator/health`
|
|
- **Health Readiness**: `GET /actuator/health/readiness`
|
|
- **Health Liveness**: `GET /actuator/health/liveness`
|
|
- **Info**: `GET /actuator/info`
|
|
- **Circuit Breakers**: `GET /actuator/circuitbreakers`
|
|
- **Metrics**: `GET /actuator/metrics`
|
|
- **Prometheus**: `GET /actuator/prometheus`
|
|
|
|
### Circuit Breaker Monitoring
|
|
```bash
|
|
# Circuit Breaker Status
|
|
curl http://localhost:8082/actuator/circuitbreakers
|
|
|
|
# Metrics
|
|
curl http://localhost:8082/actuator/metrics/resilience4j.circuitbreaker.calls
|
|
|
|
# Prometheus Format
|
|
curl http://localhost:8082/actuator/prometheus | grep circuit
|
|
```
|
|
|
|
### Service Discovery
|
|
Bei aktiviertem Consul wird der Service automatisch registriert:
|
|
- **Service Name**: `ping-service`
|
|
- **Health Check**: `/actuator/health`
|
|
- **Check Interval**: 10 Sekunden
|
|
|
|
## 🔧 Troubleshooting
|
|
|
|
### Häufige Probleme
|
|
|
|
#### 1. Service startet nicht (Port bereits belegt)
|
|
```bash
|
|
# Port prüfen
|
|
netstat -tlnp | grep 8082
|
|
|
|
# Alternativen Port verwenden
|
|
SERVER_PORT=8083 ./gradlew :temp:ping-service:bootRun
|
|
```
|
|
|
|
#### 2. Circuit Breaker öffnet nicht
|
|
- Mindestens 4 Calls erforderlich (siehe `minimum-number-of-calls`)
|
|
- 60% Failure Rate erforderlich
|
|
- Verwende `/ping/test-failure` für Tests
|
|
|
|
#### 3. Consul Connection Failed
|
|
```bash
|
|
# Consul Status prüfen
|
|
consul agent -dev
|
|
|
|
# Oder Service ohne Consul starten
|
|
spring.cloud.consul.discovery.enabled=false
|
|
```
|
|
|
|
#### 4. Docker Build Fails
|
|
```bash
|
|
# Build Context prüfen - muss von Projekt-Root ausgeführt werden
|
|
docker build -t ping-service:test -f temp/ping-service/Dockerfile .
|
|
|
|
# Nicht von temp/ping-service/ ausführen!
|
|
```
|
|
|
|
### Debug Mode
|
|
```bash
|
|
# Debug Mode aktivieren
|
|
DEBUG=true ./gradlew :temp:ping-service:bootRun
|
|
|
|
# Debug Port: 5005
|
|
```
|
|
|
|
### Logs
|
|
```bash
|
|
# Alle Logs
|
|
docker logs <container-id>
|
|
|
|
# Circuit Breaker Logs
|
|
docker logs <container-id> 2>&1 | grep -i circuit
|
|
|
|
# Health Check Logs
|
|
docker logs <container-id> 2>&1 | grep -i health
|
|
```
|
|
|
|
## 📝 Entwicklungsnotizen
|
|
|
|
### Warum Circuit Breaker?
|
|
Der Circuit Breaker Pattern verhindert:
|
|
- **Cascade Failures**: Verhindert Ausfall-Kaskaden
|
|
- **Resource Exhaustion**: Schont Ressourcen bei Service-Problemen
|
|
- **Fast Failure**: Schnelle Fehlerrückmeldung statt lange Timeouts
|
|
|
|
### Fallback Strategy
|
|
Bei OPEN Circuit Breaker:
|
|
- Sofortige Fallback-Response (keine Latenz)
|
|
- Informative Fehlermeldungen
|
|
- Status-Informationen für Debugging
|
|
|
|
### Production Readiness
|
|
- Health Checks für Kubernetes/Docker
|
|
- Prometheus Metriken für Monitoring
|
|
- Non-root Container für Sicherheit
|
|
- Optimierte JVM Settings für Container
|
|
|
|
---
|
|
|
|
**Letzte Aktualisierung**: 2025-08-14
|
|
**Version**: 1.0.0
|
|
**Maintainer**: Meldestelle Development Team
|