Modul 321 Alle Aufgaben

Aufgabe 5: Zentrale Konfiguration mit Spring Cloud Config

Zielsetzung

In einer verteilten Microservice-Architektur besitzt jeder Service eigene Konfigurationsparameter: Datenbankverbindungen, Fremd-APIs, Timeouts und Feature-Flags. Diese Konfigurationen in jedem Service lokal in application.properties zu pflegen, führt zu Konfigurationsabweichungen (Configuration Drift), Sicherheitsrisiken (Zugangsdaten im Quellcode) und Neustarts bei jeder Parameteränderung.

In dieser Aufgabe lernen Sie Spring Cloud Config kennen:

  1. Wie ein zentraler Config-Server Konfigurationen aus einem Git-Repository oder Dateisystem verwaltet.
  2. Wie Config-Clients beim Start ihre Konfiguration dynamisch vom Server beziehen.
  3. Wie Sie verschiedene Umgebungen (Profile wie default, qa, prod) trennen.
  4. Wie Konfigurationsänderungen zur Laufzeit ohne Neustart über Spring Boot Actuator und @RefreshScope geladen werden.
  5. Wie vertrauliche Daten (Secrets) verschlüsselt gespeichert werden.

Material & Vorlagen

Das Archiv enthält drei Verzeichnisse:


Die Architektur im Überblick

flowchart TD
    Git["Zentrales Git-Repository / Verzeichnis<br>(s1rates.properties, s1rates-qa..)"]
    Server["Config-Server (Port 8888)<br>@EnableConfigServer"]
    Client["Config-Client (Port 8080)<br>@RefreshScope"]

    Git -->|"liest Properties bei Start & Refresh"| Server
    Server -->|"HTTP GET /s1rates/default (liefert Key-Value)"| Client

Vorgehen

Teil 1: Config-Server starten und prüfen

  1. Entpacken Sie spring-cloud-config-starter.zip und öffnen Sie das Projekt in IntelliJ IDEA.
  2. Öffnen Sie das Modul configserver.
  3. Untersuchen Sie die Hauptklasse ConfigserverApplication.java. Beachten Sie die Annotation @EnableConfigServer:
    @SpringBootApplication
    @EnableConfigServer
    public class ConfigserverApplication {
        public static void main(String[] args) {
            SpringApplication.run(ConfigserverApplication.class, args);
        }
    }
  4. Öffnen Sie src/main/resources/application.properties des Config-Servers:
    server.port=8888
    spring.cloud.config.server.git.uri=file://${user.dir}/school-spring-cloudconfig-wa-tolls
    Hinweis: Der Server kann ein entferntes Git-Repository oder ein lokales Verzeichnis verwenden.
  5. Starten Sie die Anwendung ConfigserverApplication.
  6. Testen Sie im Browser oder mit curl, ob der Server Konfigurationen ausliefert:
    curl http://localhost:8888/s1rates/default

Teil 2: Konfigurations-Namenskonventionen

Der Config-Server folgt einer festen URL- und Dateinamen-Konvention:

URL-Muster: http://<host>:8888/<application-name>/<profile>[/<label>]


Teil 3: Client-Anwendung anbinden

  1. Öffnen Sie das Modul config-client.
  2. Untersuchen Sie die Datei src/main/resources/application.properties des Clients:
    spring.application.name=s1rates
    spring.profiles.active=default
    spring.config.import=configserver:http://localhost:8888
    Wichtig: spring.application.name bestimmt, welchen Konfigurationssatz der Client beim Server anfragt.
  3. Betrachten Sie den Controller RateController.java:
    @Controller
    @RefreshScope
    public class RateController {
        @Value("${rateamount:1.00}")
        private String rateamount;
    
        @Value("${lanes:1}")
        private String lanes;
    
        @GetMapping("/rate")
        public String getRate(Model model) {
            model.addAttribute("rateamount", rateamount);
            model.addAttribute("lanes", lanes);
            return "rateview";
        }
    }
  4. Starten Sie ConfigClientApplication (Port 8080).
  5. Rufen Sie http://localhost:8080/rate auf.

Teil 4: Dynamischer Refresh ohne Neustart (@RefreshScope)

In traditionellen Anwendungen erfordert jede Einstellungsänderung einen Neustart des Service. Mit Spring Boot Actuator und @RefreshScope lassen sich Konfigurationen im laufenden Betrieb aktualisieren.

  1. Ändern Sie in der Datei school-spring-cloudconfig-wa-tolls/s1rates.properties den Wert von rateamount (z. B. auf 4.20).
  2. Führen Sie im Verzeichnis einen Git-Commit durch (sofern ein lokales Git eingerichtet ist):
    git add s1rates.properties
    git commit -m "Update rateamount to 4.20"
  3. Prüfen Sie am Config-Server nach: Liefert http://localhost:8888/s1rates/default den neuen Wert?
  4. Rufen Sie die Client-Seite http://localhost:8080/rate auf.
    Beobachtung: Der Client zeigt noch den alten Wert an, da Properties im Speicher gehalten werden.
  5. Senden Sie einen leeren POST-Request an den Actuator-Refresh-Endpunkt des Clients:
    curl -X POST http://localhost:8080/actuator/refresh
  6. Laden Sie http://localhost:8080/rate im Browser neu:

Teil 5: Secrets verschlüsseln (Vertiefung)

Passwörter oder API-Schlüssel gehören nicht im Klartext in Konfigurationsdateien.

  1. Hinterlegen Sie im Config-Server einen symmetrischen Schlüssel (application.properties):
    encrypt.key=MeinGeheimesSchluesselWort123!
  2. Starten Sie den Server neu und verschlüsseln Sie einen Wert über den Endpunkt /encrypt:
    curl http://localhost:8888/encrypt -d "SuperSecretPassword"
  3. Den generierten Chiffretext können Sie mit dem Präfix {cipher} in Ihre Properties einfügen:
    db.password={cipher}c8a49ef2...
  4. Der Config-Server entschlüsselt den Wert bei autorisierten Client-Anfragen automatisch.

Abgabe

Halten Sie Ihre Antworten und Erkenntnisse in einer kurzen Notiz oder Markdown-Datei fest:

  1. Screenshot der Config-Server-Antwort im Browser auf /s1rates/default.
  2. Screenshot der Client-Webseite /rate vor und nach dem Aufruf von /actuator/refresh.
  3. Erklärungsfragen: