Ein Spring Boot Microservices-Projekt mit Eureka Service Discovery, zentraler Konfiguration und synchroner REST-Kommunikation über OpenFeign.
┌─────────────────┐
│ Config Server │ :8888
│ (classpath) │
└────────┬────────┘
│ lädt Konfiguration
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Discovery Server │ │ Customer Service │ │ Fraud Service │
│ (Eureka) :8761 │ │ :8090 │ │ :8091 │
└──────────────────┘ └────────┬─────────┘ └──────────────────┘
│ OpenFeign (service discovery)
└──────────────────────▶ fraud-service
(Geplant / noch leer)
┌──────────────┐ ┌────────────────────┐ ┌─────────────────┐
│ API Gateway │ │ Order Service │ │ Notifications │
│ (leer) │ │ (leer) :8081 │ │ (leer) :8082 │
└──────────────┘ └────────────────────┘ └─────────────────┘
| Service | Port | Status | Beschreibung |
|---|---|---|---|
config-server |
8888 | fertig | Zentrale Konfiguration (native classpath) |
discovery-server |
8761 | fertig | Eureka Service Registry |
customer |
8090 | fertig | CRUD + Statusverwaltung für Kunden, ruft Fraud auf |
fraud |
8091 | fertig | Fraud-Prüfung, Blacklist, Check-Historie |
shared |
– | fertig | Gemeinsame DTOs (FraudCheckRequest/Response) |
api-gateway |
– | Stub (leer) | Noch kein Code |
order |
8081 | Stub (leer) | Nur leerer Service + ApplicationClass |
notifications |
8082 | Stub (leer) | Nur leerer Service + ApplicationClass |
frontend |
– | Stub (leer) | pom.xml angelegt, kein Code |
Basis-CRUD:
POST /api/v1/customers— Kunde anlegen (löst automatisch Fraud-Check aus)GET /api/v1/customers/{id}— Kunde per ID abrufenGET /api/v1/customers— Alle Kunden abrufenPUT /api/v1/customers/{id}— Kunde aktualisierenGET /api/v1/customers/search?email=— Kunde per E-Mail suchen
Statusverwaltung:
POST /api/v1/customers/{id}/activate— Kunde aktivierenPOST /api/v1/customers/{id}/deactivate— Kunde deaktivierenPATCH /api/v1/customers/{id}/block— Kunde sperren
Kundenstatusmodell: ACTIVE → INACTIVE ↔ ACTIVE, ACTIVE → BLOCKED
Validierungen & Fehlerbehandlung:
- E-Mail muss eindeutig sein (409 Conflict)
- Doppelte Statusübergänge werden abgelehnt (409 Conflict)
- Bean Validation auf allen Request-DTOs (400 Bad Request)
- Fraud-Check blockiert Registrierung wenn Status
REJECTED
Fraud-Check:
POST /api/v1/fraud-check— Prüft ob ein Kunde betrügerisch istGET /api/v1/fraud-check/{customerId}/history— Prüfhistorie eines Kunden
Blacklist:
POST /api/v1/blacklist/{customerId}?reason=— Kunde auf Blacklist setzenDELETE /api/v1/blacklist/{customerId}— Kunde von Blacklist entfernen
Fraud-Regeln (FraudRuleEvaluator):
- Ist der Kunde auf der Blacklist? →
REJECTED - Mehr als 3 Checks in 24 Stunden? →
REJECTED - Sonst →
APPROVED
- Java 17+
- Maven 3.8+
- Docker + Docker Compose
cd docker
# .env Datei anlegen:
cat > .env <<EOF
POSTGRES_USER=mindgarden
POSTGRES_PASSWORD=password
PGADMIN_DEFAULT_EMAIL=admin@mindgarden.com
PGADMIN_DEFAULT_PASSWORD=admin
EOF
docker compose up -d postgres pgadminDie Datenbanken customers und fraud werden automatisch per init.sql angelegt.
| Tool | URL | Login |
|---|---|---|
| pgAdmin | http://localhost:5050 | admin@mindgarden.com / admin |
Die Startreihenfolge ist wichtig, da die Services auf Config- und Discovery-Server warten:
# 1. Config Server (zuerst – alle anderen holen hier ihre Konfiguration)
cd config-server && mvn spring-boot:run
# 2. Discovery Server (Eureka)
cd discovery-server && mvn spring-boot:run
# 3. Fraud Service
cd fraud && mvn spring-boot:run
# 4. Customer Service (zuletzt – ruft Fraud per Feign auf)
cd customer && mvn spring-boot:run- Eureka Dashboard: http://localhost:8761
- Customer API: http://localhost:8090/api/v1/customers
- Fraud API: http://localhost:8091/api/v1/fraud-check
# Kunde anlegen
curl -X POST http://localhost:8090/api/v1/customers \
-H "Content-Type: application/json" \
-d '{
"firstname": "Max",
"lastname": "Mustermann",
"email": "max@example.de",
"phone": "+49 151 12345678",
"address": {
"street": "Musterstraße",
"houseNumber": "1",
"zipCode": "10115",
"city": "Berlin",
"country": "Deutschland"
}
}'Der Customer Service hat Integrationstests mit Testcontainers (echte PostgreSQL-Instanz):
cd customer && mvn testGetestete Szenarien: Customer anlegen, Adresse mitgeben, doppelte E-Mail, Statusübergänge (activate/deactivate/block), Suche per E-Mail.
| Technologie | Version | Verwendung |
|---|---|---|
| Spring Boot | 3.5.x | Application Framework |
| Spring Cloud | 2025.0.x | Config Server, Eureka, OpenFeign |
| Spring Data JPA | – | Datenbankzugriff |
| PostgreSQL | – | Datenbank (customers, fraud) |
| Lombok | – | Boilerplate-Reduktion |
| Testcontainers | – | Integrationstests mit echter DB |
| Docker Compose | – | Lokale Infrastruktur |
| OWASP Dependency-Check | 10.0.4 | Sicherheits-Scan der Dependencies |
- API Gateway implementieren (Spring Cloud Gateway) — zentraler Einstiegspunkt, Routing zu den Services
- Order Service implementieren — Bestellung anlegen, Kundenstatus prüfen, Fraud-Check auslösen
- Notification Service implementieren — z.B. E-Mail bei Registrierung oder Statusänderung (Maildev läuft bereits in Docker)
- Asynchrone Kommunikation einführen — aktuell läuft alles synchron über REST/Feign; für Bestellungen und Benachrichtigungen wäre Kafka oder RabbitMQ sinnvoll
- Frontend entwickeln — Modul ist angelegt, aber leer
- Bug im FraudCheckService beheben —
history.setFraudStatus(FraudStatus.APPROVED)wird hardcoded gesetzt, unabhängig vom tatsächlichen Ergebnis des Evaluators - CustomerStatus-Übergang vervollständigen —
TODOim Code: BLOCKED-Kunden können noch nicht aktiviert werden - Integrationstests für Fraud Service schreiben
- Docker-Compose um alle Services erweitern (aktuell nur DB + pgAdmin)
microservices/
├── config-server/ # Zentrale Konfiguration für alle Services
├── discovery-server/ # Eureka Service Registry
├── shared/ # Gemeinsame DTOs (FraudCheckRequest/Response)
├── customer/ # Customer Service (fertig + getestet)
├── fraud/ # Fraud Service (fertig)
├── order/ # Order Service (Stub)
├── notifications/ # Notification Service (Stub)
├── api-gateway/ # API Gateway (Stub)
├── frontend/ # Frontend (Stub)
├── docker/
│ ├── docker-compose.yml # PostgreSQL, pgAdmin, Maildev, MongoDB
│ └── scripts/init.sql # DB-Initialisierung
└── pom.xml # Root-POM (Multi-Module Maven)