Spring Cloud Config – zarządzanie konfiguracją

TL;DR: Spring Cloud Config pozwala na centralne zarządzanie konfiguracją mikroserwisów. Server przechowuje konfigurację w Git, a klienci pobierają ją przy starcie. Dzięki temu jeden plik application.yml może obsłużyć dziesiątki serwisów, a zmiany nie wymagają redeploy.

Dlaczego centralne zarządzanie konfiguracji jest ważne?

W architekturze mikroserwisów zarządzanie konfiguracją staje się kluczowym wyzwaniem. Każdy serwis potrzebuje dostępu do baz danych, kolejek, zewnętrznych API – i wszystkie te ustawienia mogą się różnić między środowiskami (dev, test, prod). Spring Cloud Config rozwiązuje ten problem przez centralizację konfiguracji w jednym miejscu.

Co się nauczysz:

  • Jak skonfigurować Spring Cloud Config Server
  • Jak połączyć aplikacje klienckie z serwerem konfiguracji
  • Jak organizować pliki konfiguracyjne w repozytorium Git
  • Jak zarządzać konfiguracją dla różnych środowisk
  • Jak dynamicznie odświeżać konfigurację bez restartu

Wymagania wstępne:

  • Podstawowa znajomość Spring Boot
  • Doświadczenie z plikami application.yml/properties
  • Podstawy Git (tworzenie repozytoriów, commit, push)
  • Zrozumienie koncepcji mikroserwisów

Czym jest Spring Cloud Config?

Spring Cloud Config to rozwiązanie składające się z dwóch komponentów:

Config Server: Serwer który udostępnia konfigurację przez REST API, pobierając ją z repozytorium Git
Config Client: Biblioteka która automatycznie pobiera konfigurację z serwera przy starcie aplikacji
Wyobraź sobie Config Server jako bibliotekę z książkami kucharskimi, a każdy mikroserwis jako kucharza który przychodzi po swój przepis. Zamiast każdy kucharz trzymał swoje przepisy w kuchni, wszyscy idą do jednej biblioteki po aktualne wersje.

Tworzenie Config Server

Konfiguracja podstawowa

Zacznijmy od utworzenia Config Server. Dodaj zależność do pom.xml:


    org.springframework.cloud
    spring-cloud-config-server



    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client

Główna klasa aplikacji:

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
Adnotacja @EnableConfigServer aktywuje funkcjonalność serwera konfiguracji. @EnableEurekaClient pozwala na rejestrację w Eureka Discovery Service.

Konfiguracja application.yml

server:
  port: 8888

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your-username/config-repo
          clone-on-start: true
          default-label: master

eureka:
  client:
    service-url:
      default-zone: http://localhost:8761/eureka/
Pro tip: Użyj clone-on-start: true żeby Config Server od razu pobrał repozytorium przy starcie i wykrył potencjalne problemy z dostępem.

Przygotowanie repozytorium konfiguracji

Struktura plików konfiguracyjnych

Utwórz repozytorium Git z następującą strukturą:

config-repo/
├── application.yml                 # Domyślna konfiguracja dla wszystkich aplikacji
├── application-dev.yml            # Konfiguracja dla środowiska dev
├── application-prod.yml           # Konfiguracja dla środowiska prod
├── user-service.yml              # Specyficzna konfiguracja dla user-service
├── user-service-dev.yml          # user-service w środowisku dev
└── order-service.yml             # Specyficzna konfiguracja dla order-service
Spring Cloud Config używa konwencji nazewnictwa: {application-name}-{profile}.yml. Pliki są ładowane w określonej kolejności, gdzie bardziej specyficzne nadpisują ogólne.

Przykład konfiguracji application.yml

# application.yml - domyślna konfiguracja
management:
  endpoints:
    web:
      exposure:
        include: health,info,refresh

logging:
  level:
    org.springframework.web: INFO
    org.hibernate: WARN

# Domyślne ustawienia bazy danych
spring:
  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: false

Konfiguracja specyficzna dla środowiska

# application-dev.yml
spring:
  datasource:
    url: jdbc:h2:mem:devdb
    driver-class-name: org.h2.Driver
    username: sa
    password: 
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true

logging:
  level:
    org.springframework.web: DEBUG
    com.yourcompany: DEBUG
# application-prod.yml  
spring:
  datasource:
    url: jdbc:postgresql://prod-db:5432/maindb
    driver-class-name: org.postgresql.Driver
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    
management:
  endpoints:
    web:
      exposure:
        include: health,metrics
Uwaga: Nigdy nie commituj haseł i kluczy API bezpośrednio do repozytorium. Używaj zmiennych środowiskowych lub narzędzi jak Vault.

Konfiguracja klienta Spring Cloud Config

Dodanie zależności do projektu klienta


    org.springframework.cloud
    spring-cloud-starter-config



    org.springframework.boot
    spring-boot-starter-actuator

Konfiguracja bootstrap.yml

W aplikacji klienckiej utwórz plik bootstrap.yml (ładowany przed application.yml):

spring:
  application:
    name: user-service
  profiles:
    active: dev
  cloud:
    config:
      uri: http://localhost:8888
      fail-fast: true
      retry:
        initial-interval: 1000
        max-attempts: 6
bootstrap.yml: Specjalny plik konfiguracyjny ładowany przed application.yml, używany do konfiguracji infrastruktury jak Config Server

Testowanie połączenia

Utwórz kontroler testowy:

@RestController
@RefreshScope
public class ConfigTestController {
    
    @Value("${app.message:Default message}")
    private String message;
    
    @Value("${spring.datasource.url:No datasource configured}")
    private String datasourceUrl;
    
    @GetMapping("/config")
    public Map getConfig() {
        Map config = new HashMap<>();
        config.put("message", message);
        config.put("datasource", datasourceUrl);
        config.put("profile", System.getProperty("spring.profiles.active"));
        return config;
    }
}
@RefreshScope pozwala na dynamiczne odświeżanie konfiguracji bez restartu aplikacji przez endpoint /actuator/refresh.

Dynamiczne odświeżanie konfiguracji

Konfiguracja webhooków Git

Aby automatycznie odświeżać konfigurację po zmianach w repozytorium, dodaj Spring Cloud Bus:


    org.springframework.cloud
    spring-cloud-starter-bus-amqp

Konfiguracja RabbitMQ w application.yml:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

management:
  endpoints:
    web:
      exposure:
        include: health,refresh,bus-refresh

Testowanie odświeżania

Zmień wartość w repozytorium konfiguracji i wyślij POST request:

# Odświeżenie pojedynczej aplikacji
curl -X POST http://localhost:8080/actuator/refresh

# Odświeżenie wszystkich aplikacji przez bus
curl -X POST http://localhost:8888/actuator/bus-refresh
Pułapka: Nie wszystkie właściwości mogą być odświeżane dynamicznie. Konfiguracja bazy danych, porty serwera czy konfiguracja security wymagają restartu aplikacji.

Najlepsze praktyki

Pro tip: Organizuj konfigurację hierarchicznie – od najbardziej ogólnej (application.yml) do najbardziej specyficznej (service-profile.yml). Każdy poziom może nadpisywać ustawienia z poziomu wyżej.

Zabezpieczenie Config Server

# Config Server - dodanie Basic Auth
spring:
  security:
    user:
      name: configuser
      password: ${CONFIG_SERVER_PASSWORD:defaultpass}
      
# Config Client - autoryzacja
spring:
  cloud:
    config:
      uri: http://localhost:8888
      username: configuser
      password: ${CONFIG_SERVER_PASSWORD:defaultpass}

Szyfrowanie wrażliwych danych

Spring Cloud Config obsługuje szyfrowanie wartości:

# W pliku konfiguracyjnym - zaszyfrowana wartość
database:
  password: '{cipher}AQA1+2+3+4+encrypted+password+here'
  
# Config Server automatycznie odszyfruje przed wysłaniem do klienta
Typowy błąd: Zapominanie o ustawieniu fail-fast: true w kliencie. Bez tego aplikacja wystartuje z domyślną konfiguracją gdy Config Server jest niedostępny, co może prowadzić do problemów w produkcji.
Czy Config Server to single point of failure?

Tak, dlatego w produkcji należy uruchomić kilka instancji Config Server za load balancerem. Dodatkowo klienci mogą cache’ować konfigurację lokalnie jako fallback.

Jak zarządzać sekretami w Config Server?

Używaj zmiennych środowiskowych, Azure Key Vault, AWS Secrets Manager lub HashiCorp Vault. Nigdy nie commituj sekretów bezpośrednio do Git.

Czy mogę używać innych źródeł niż Git?

Tak, Spring Cloud Config obsługuje SVN, system plików lokalnych, Vault, JDBC i inne źródła konfiguracji.

Jak przetestować konfigurację przed wdrożeniem?

Config Server udostępnia REST API: GET /{application}/{profile} pozwala sprawdzić jaką konfigurację otrzyma klient przed jego uruchomieniem.

Co się stanie gdy Git repo nie jest dostępne?

Config Server używa lokalnego cache. Jeśli repo nie jest dostępne, serwuje ostatnio znaną wersję konfiguracji. Klienci z fail-fast: false wystartują z lokalną konfiguracją.

Jak debugować problemy z ładowaniem konfiguracji?

Włącz debug logging: logging.level.org.springframework.cloud.config: DEBUG i sprawdź endpoint /actuator/env aby zobaczyć źródła konfiguracji.

Przydatne zasoby:

🚀 Zadanie dla Ciebie

Stwórz kompletny setup Spring Cloud Config:

  1. Skonfiguruj Config Server z repozytorium Git
  2. Utwórz dwie aplikacje klienckie (user-service, order-service)
  3. Przygotuj konfigurację dla trzech środowisk: dev, test, prod
  4. Przetestuj dynamiczne odświeżanie konfiguracji
  5. Dodaj zabezpieczenie Basic Auth do Config Server

Powodzenia! Podziel się swoimi wynikami w komentarzach – chętnie pomogę z ewentualnymi problemami.

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry