This commit introduces a comprehensive refactoring of the messaging module to establish a fully reactive, non-blocking, and robust infrastructure for Kafka-based communication. Features & Refinements Reactive Publisher: The KafkaEventPublisher has been refactored from a blocking implementation (KafkaTemplate) to a fully non-blocking, reactive one using Spring's ReactiveKafkaProducerTemplate. The EventPublisher interface now returns reactive types (Mono, Flux) to reflect the asynchronous nature of the operations. Reactive Consumer: A new KafkaEventConsumer has been implemented, providing a standardized, reusable, and reactive way for services to consume events. It encapsulates the complexity of reactor-kafka and exposes a simple receiveEvents<T>(topic) method that returns a Flux<T>. Architectural Cleanup: The Spring configuration has been split. The basic ProducerFactory and consumer properties reside in messaging-config, while the reactive-specific ReactiveKafkaProducerTemplate bean is now correctly located in messaging-client. Testing Added Kafka Integration Test: A new KafkaIntegrationTest has been created to ensure the reliability of the messaging infrastructure. The test uses Testcontainers to spin up a real Apache Kafka broker for end-to-end validation. Project Reactor's StepVerifier is used to test the reactive streams deterministically, avoiding flaky tests. The test correctly manages the lifecycle of Kafka producers to ensure clean shutdown without hanging threads. Bug Fixes Resolved UninitializedPropertyAccessException in tests by making the KafkaConfig test-friendly. Fixed IllegalStateException related to Testcontainers lifecycle by making the container a static resource. Corrected compilation errors in tests related to resource cleanup by using the concrete DefaultKafkaProducerFactory type. |
||
|---|---|---|
| .fleet | ||
| .github | ||
| client | ||
| config | ||
| core | ||
| docs | ||
| events | ||
| gradle | ||
| horses | ||
| infrastructure | ||
| masterdata | ||
| members | ||
| platform | ||
| scripts | ||
| .editorconfig | ||
| .env.prod.example | ||
| .gitignore | ||
| build.gradle.kts | ||
| docker-compose.prod.yml | ||
| docker-compose.yml | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| README-ENV.md | ||
| README-PRODUCTION.md | ||
| README.md | ||
| settings.gradle.kts | ||
Meldestelle
Überblick
Meldestelle ist ein modulares System zur Verwaltung von Pferdesportveranstaltungen. Das System ermöglicht die Registrierung von Pferden, Mitgliedern und Veranstaltungen sowie die Verwaltung von Stammdaten.
Das Projekt wurde kürzlich auf eine modulare Architektur migriert, um die Wartbarkeit und Erweiterbarkeit zu verbessern.
Systemanforderungen
- Java 21
- Kotlin 2.1.21
- Gradle 8.14
- Docker und Docker Compose
Infrastruktur
Das System nutzt folgende Dienste:
- PostgreSQL 16: Primäre Datenbank
- Redis 7: Caching
- Keycloak 23.0: Authentifizierung und Autorisierung
- Kafka 7.5.0: Messaging und Event-Streaming
- Zipkin: Distributed Tracing
- Prometheus & Grafana: Monitoring (optional)
Projektstruktur
Das Projekt ist in folgende Hauptmodule unterteilt:
-
core: Gemeinsame Kernkomponenten
- core-domain: Domänenmodelle und Geschäftslogik
- core-utils: Allgemeine Hilfsfunktionen
-
masterdata: Umfassende Verwaltung von Stammdaten für Pferdesportveranstaltungen
- Funktionalität: Länder (ISO-Codes, EU/EWR-Mitgliedschaft), Bundesländer (OEPS/ISO-Codes), Altersklassen (Teilnahmeberechtigung), Turnierplätze (Typ, Abmessungen, Boden)
- API-Endpunkte: 37 REST-Endpunkte mit vollständiger CRUD-Funktionalität
- Geschäftslogik: Validierung, Duplikatsprüfung, Berechtigung, Eignung für Disziplinen
- masterdata-api: REST-Controller und DTO-Definitionen
- masterdata-application: Use Cases und Geschäftslogik
- masterdata-domain: Domänenmodelle und Repository-Interfaces
- masterdata-infrastructure: Datenbankzugriff und Persistierung
- masterdata-service: Spring Boot Service-Implementierung
-
members: Mitgliederverwaltung
- members-api: API-Definitionen
- members-application: Anwendungslogik
- members-domain: Domänenmodelle
- members-infrastructure: Infrastrukturkomponenten
- members-service: Service-Implementierung
-
horses: Pferderegistrierung
- horses-api: API-Definitionen
- horses-application: Anwendungslogik
- horses-domain: Domänenmodelle
- horses-infrastructure: Infrastrukturkomponenten
- horses-service: Service-Implementierung
-
events: Veranstaltungsverwaltung
- events-api: API-Definitionen
- events-application: Anwendungslogik
- events-domain: Domänenmodelle
- events-infrastructure: Infrastrukturkomponenten
- events-service: Service-Implementierung
-
infrastructure: Gemeinsame Infrastrukturkomponenten
- auth: Authentifizierung
- cache: Caching
- event-store: Event-Speicher
- gateway: API-Gateway
- messaging: Messaging-Infrastruktur
- monitoring: Monitoring-Komponenten
-
client: Client-Anwendungen
- common-ui: Gemeinsame UI-Komponenten
- desktop-app: Desktop-Anwendung
- web-app: Web-Anwendung
Installation und Setup
Voraussetzungen
Stellen Sie sicher, dass Java 21, Docker und Docker Compose installiert sind.
Docker-Infrastruktur
Das System bietet verschiedene Docker-Konfigurationen für unterschiedliche Umgebungen:
Entwicklungsumgebung (Schnellstart)
# Infrastruktur starten
docker-compose up -d
# Status überprüfen
docker-compose ps
# Logs anzeigen
docker-compose logs -f
Dies startet alle erforderlichen Dienste wie PostgreSQL, Redis, Keycloak, Kafka, Zipkin und optional Prometheus und Grafana.
Produktionsumgebung
Für die Produktionsumgebung siehe README-PRODUCTION.md - enthält:
- Umfassende Sicherheitskonfiguration
- SSL/TLS-Setup
- Detaillierte Troubleshooting-Anleitung
- Backup- und Wiederherstellungsverfahren
Umgebungsvariablen
Für die Konfiguration von Umgebungsvariablen siehe README-ENV.md - enthält:
- Vollständige Umgebungsvariablen-Dokumentation
- Validierungsskripte
- Konfigurationsbeispiele
Validierung und Troubleshooting
# Umgebungsvariablen validieren
./validate-env.sh
# Docker-Compose Konfiguration validieren
./validate-docker-compose.sh
# Service-Status überprüfen
docker-compose ps
# Service-Logs anzeigen
docker-compose logs [service-name]
Projekt bauen
./gradlew build
Dienste starten
# Gateway starten
./gradlew :infrastructure:gateway:bootRun
# Masterdata-Service starten
./gradlew :masterdata:masterdata-service:bootRun
# Members-Service starten
./gradlew :members:members-service:bootRun
# Horses-Service starten
./gradlew :horses:horses-service:bootRun
# Events-Service starten
./gradlew :events:events-service:bootRun
Client-Anwendungen starten
# Desktop-Anwendung starten
./gradlew :client:desktop-app:run
# Web-Anwendung bauen
./gradlew :client:web-app:build
Entwicklung
Aktuelle Migrationshinweise
Das Projekt wurde kürzlich von einer monolithischen Struktur zu einer modularen Architektur migriert. Die Migration umfasste:
- Umzug von
:shared-kernelzucore-Modulen - Umzug von
:master-datazumasterdata-Modulen - Umzug von
:member-managementzumembers-Modulen - Umzug von
:horse-registryzuhorses-Modulen - Umzug von
:event-managementzuevents-Modulen - Umzug von
:api-gatewayzuinfrastructure/gateway - Umzug von
:composeAppzuclient-Modulen
Es gibt noch einige offene Probleme, insbesondere bei den Client-Modulen, die Kotlin Multiplatform und Compose Multiplatform verwenden.
Entwicklungsrichtlinien
- Verwenden Sie die in der Projektstruktur definierten Module
- Folgen Sie den Architekturentscheidungen (ADRs) im Verzeichnis
docs/architecture/adr(verfügbar in Deutsch mit Dateiendung-de.md) - Verwenden Sie die C4-Diagramme im Verzeichnis
docs/architecture/c4für einen Überblick über die Systemarchitektur (verfügbar in Deutsch mit Dateiendung-de.puml) - Verwenden Sie die Datenmodelle aus
docs/architecture/data-model
Tests ausführen
./gradlew test
Docker Troubleshooting (Entwicklungsumgebung)
Häufige Probleme und Lösungen
1. Services starten nicht
# Alle Services stoppen und neu starten
docker-compose down
docker-compose up -d
# Einzelnen Service neu starten
docker-compose restart [service-name]
# Service-Logs überprüfen
docker-compose logs [service-name]
2. Port bereits belegt
# Verwendete Ports prüfen
netstat -tulpn | grep :[port]
# oder
lsof -i :[port]
# Ports in .env anpassen
nano .env
# Beispiel: API_PORT=8081 statt 8080
3. Datenbank-Verbindungsfehler
# PostgreSQL-Status prüfen
docker-compose exec postgres pg_isready -U meldestelle
# Datenbank-Logs anzeigen
docker-compose logs postgres
# Verbindung manuell testen
docker-compose exec postgres psql -U meldestelle -d meldestelle
4. Keycloak-Authentifizierung fehlgeschlagen
# Keycloak-Status prüfen
docker-compose logs keycloak
# Keycloak Admin-Console öffnen
# http://localhost:8180/admin (admin/admin)
# Keycloak-Datenbank zurücksetzen
docker-compose down
docker volume rm meldestelle_postgres-data
docker-compose up -d
5. Kafka-Verbindungsprobleme
# Kafka-Status prüfen
docker-compose exec kafka kafka-topics --bootstrap-server localhost:9092 --list
# Zookeeper-Status prüfen
docker-compose exec zookeeper nc -z localhost 2181
# Kafka-Logs anzeigen
docker-compose logs kafka zookeeper
6. Speicherplatz-Probleme
# Docker-Speicherverbrauch prüfen
docker system df
# Ungenutzte Ressourcen bereinigen
docker system prune -f
# Volumes bereinigen (ACHTUNG: Datenverlust!)
docker system prune -f --volumes
7. Performance-Probleme
# Ressourcenverbrauch überwachen
docker stats
# Container-Limits anpassen (in docker-compose.yml)
# deploy:
# resources:
# limits:
# memory: 1G
# cpus: '0.5'
Nützliche Docker-Befehle
# Alle Services mit Logs starten
docker-compose up
# Services im Hintergrund starten
docker-compose up -d
# Bestimmte Services starten
docker-compose up postgres redis
# Services stoppen
docker-compose stop
# Services stoppen und Container entfernen
docker-compose down
# Services mit Volume-Bereinigung stoppen
docker-compose down -v
# Container-Shell öffnen
docker-compose exec [service-name] /bin/bash
# oder für Alpine-basierte Images:
docker-compose exec [service-name] /bin/sh
# Konfiguration validieren
docker-compose config
# Service-Status anzeigen
docker-compose ps
# Logs aller Services anzeigen
docker-compose logs
# Logs eines bestimmten Services verfolgen
docker-compose logs -f [service-name]
Dokumentation
Weitere Dokumentation finden Sie im docs-Verzeichnis:
- API-Dokumentation:
docs/api - Architektur:
docs/architecture - Entwicklungsrichtlinien:
docs/development - Diagramme:
docs/diagrams - Betriebsanleitung:
docs/operations - Postman-Sammlungen:
docs/postman
Lizenz
Siehe LICENSE Datei.
Stand
Letzte Aktualisierung: 22. Juli 2025