meldestelle/infrastructure/cache/README-INFRA-CACHE.md
stefan df5919fac8 feat(build): Refactor infrastructure modules and establish single source of truth
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.
2025-07-31 14:09:22 +02:00

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 wie get(key), set(key, value, ttl) und evict(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:

  1. Abhängigkeit deklarieren: Das Service-Modul (z.B. masterdata-service) fügt eine implementation-Abhängigkeit zu :infrastructure:cache:redis-cache in seiner build.gradle.kts hinzu.

    // In masterdata-service/build.gradle.kts
    dependencies {
        implementation(projects.infrastructure.cache.redisCache)
    }
    
  2. Interface injizieren: Im Service-Code wird nur das Interface aus cache-api per 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