This commit introduces a major refactoring of the build system and the core infrastructure modules. The primary goal is to establish a strict "Single Source of Truth" for all dependencies using Gradle Version Catalogs and to create a clean, maintainable, and scalable foundation for all current and future services. ### 1. Centralized Dependency Management (`libs.versions.toml`) - **Established Single Source of Truth:** All dependency versions are now exclusively managed in `gradle/libs.versions.toml`. Hardcoded versions have been removed from all build scripts. - **Introduced Gradle Bundles:** To simplify module dependencies, several bundles have been created (e.g., `testing-jvm`, `redis-cache`, `spring-cloud-gateway`, `monitoring-client`). This drastically reduces boilerplate in the `build.gradle.kts` files and improves readability. - **Cleaned up Aliases:** All library and plugin aliases have been standardized for consistency. ### 2. Infrastructure Module Refactoring All infrastructure modules (`core`, `platform`, `auth`, `cache`, `event-store`, `messaging`, `monitoring`, `gateway`) have been refactored to align with the new dependency management strategy. - **Simplified Build Scripts:** The `build.gradle.kts` for each module now uses the new bundles and aliases, making them significantly cleaner and easier to understand. - **Consistent Structure:** The architecture of each module now clearly follows the Port-Adapter pattern where applicable (e.g., `cache-api`/`redis-cache`). - **Standardized `platform-bom`:** The project's own Bill of Materials (`platform-bom`) now also includes the Spring Cloud BOM, ensuring version consistency for all Spring-related dependencies. ### 3. Added Infrastructure Documentation To improve onboarding and architectural understanding, a dedicated `README-*.md` file has been created for each refactored infrastructure module: - `README-CORE.md` - `README-PLATFORM.md` - `README-INFRA-AUTH.md` - `README-INFRA-CACHE.md` - `README-INFRA-EVENT-STORE.md` - `README-INFRA-MESSAGING.md` - `README-INFRA-MONITORING.md` - `README-INFRA-GATEWAY.md` These documents explain the purpose, architecture, and usage of each component within the system. This lays the groundwork for our "Tracer Bullet" development approach.
3.6 KiB
Infrastructure/Cache Module
Überblick
Das Cache-Modul stellt eine zentrale und wiederverwendbare Caching-Infrastruktur für alle Microservices des Meldestelle-Systems bereit. Caching ist eine entscheidende Technik zur Verbesserung der Anwendungsleistung, zur Reduzierung der Latenz und zur Entlastung von Backend-Systemen wie der primären PostgreSQL-Datenbank.
Architektur: Port-Adapter-Muster
Das Modul folgt streng dem Port-Adapter-Muster (auch als Hexagonale Architektur bekannt), um eine saubere Trennung zwischen der Caching-Schnittstelle (dem "Port") und der konkreten Implementierung (dem "Adapter") zu gewährleisten.
infrastructure/cache/ ├── cache-api/ # Der "Port": Definiert die Caching-Schnittstelle └── redis-cache/ # Der "Adapter": Implementiert die Schnittstelle mit Redis
cache-api
Dieses Modul ist der abstrakte Teil der Architektur. Es definiert den "Vertrag" für das Caching, ohne sich um die zugrunde liegende Technologie zu kümmern.
- Zweck: Definiert ein oder mehrere Interfaces, z.B.
CacheService, mit generischen Methoden wieget(key),set(key, value, ttl)undevict(key). - Vorteil: Jeder Service im System programmiert nur gegen dieses Interface. Die Geschäftslogik ist vollständig von der Caching-Technologie entkoppelt. Ein Austausch des Caching-Providers (z.B. von Redis zu Caffeine) würde keine Änderungen in den Fach-Services erfordern.
redis-cache
Dieses Modul ist die konkrete Implementierung der in cache-api definierten Schnittstellen.
- Zweck: Stellt eine Spring-basierte Konfiguration und eine Implementierung des
CacheService-Interfaces bereit, die Redis als Datenspeicher verwendet. Es nutzt Spring Data Redis und den Lettuce-Client für die Kommunikation. - Technologie: Verwendet Jackson für die Serialisierung der zu cachenden Objekte in das JSON-Format, bevor sie in Redis gespeichert werden.
- Vorteil: Kapselt die gesamte Redis-spezifische Logik an einem einzigen Ort.
Verwendung in anderen Modulen
Ein Microservice, der Caching nutzen möchte, geht wie folgt vor:
-
Abhängigkeit deklarieren: Das Service-Modul (z.B.
masterdata-service) fügt eineimplementation-Abhängigkeit zu:infrastructure:cache:redis-cachein seinerbuild.gradle.ktshinzu.// In masterdata-service/build.gradle.kts dependencies { implementation(projects.infrastructure.cache.redisCache) } -
Interface injizieren: Im Service-Code wird nur das Interface aus
cache-apiper Dependency Injection angefordert, nicht die konkrete Redis-Klasse.// In einem Use Case oder Service @Service class MasterdataService( private val cache: CacheService // Nur das Interface wird verwendet! ) { fun findCountryById(id: String): Country? { val cacheKey = "country:$id" // 1. Versuche, aus dem Cache zu lesen val cachedCountry = cache.get<Country>(cacheKey) if (cachedCountry != null) { return cachedCountry } // 2. Wenn nicht im Cache, aus der DB lesen val dbCountry = countryRepository.findById(id) // 3. Ergebnis in den Cache schreiben für zukünftige Anfragen if (dbCountry != null) { cache.set(cacheKey, dbCountry, ttl = 3600) // Cache für 1 Stunde } return dbCountry } }
Diese Architektur stellt sicher, dass die Geschäftslogik sauber und von Infrastrukturdetails unberührt bleibt.
Letzte Aktualisierung: 31. Juli 2025