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:
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); } }
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/
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
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
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
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 MapgetConfig() { Map config = new HashMap<>(); config.put("message", message); config.put("datasource", datasourceUrl); config.put("profile", System.getProperty("spring.profiles.active")); return config; } }
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
Najlepsze praktyki
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
Tak, dlatego w produkcji należy uruchomić kilka instancji Config Server za load balancerem. Dodatkowo klienci mogą cache’ować konfigurację lokalnie jako fallback.
Używaj zmiennych środowiskowych, Azure Key Vault, AWS Secrets Manager lub HashiCorp Vault. Nigdy nie commituj sekretów bezpośrednio do Git.
Tak, Spring Cloud Config obsługuje SVN, system plików lokalnych, Vault, JDBC i inne źródła konfiguracji.
Config Server udostępnia REST API: GET /{application}/{profile} pozwala sprawdzić jaką konfigurację otrzyma klient przed jego uruchomieniem.
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ą.
Włącz debug logging: logging.level.org.springframework.cloud.config: DEBUG i sprawdź endpoint /actuator/env aby zobaczyć źródła konfiguracji.
Przydatne zasoby:
- Oficjalna dokumentacja Spring Cloud Config
- Przykładowe repozytorium konfiguracji
- Reference Guide Spring Cloud Config
- Getting Started Guide – Centralized Configuration
🚀 Zadanie dla Ciebie
Stwórz kompletny setup Spring Cloud Config:
- Skonfiguruj Config Server z repozytorium Git
- Utwórz dwie aplikacje klienckie (user-service, order-service)
- Przygotuj konfigurację dla trzech środowisk: dev, test, prod
- Przetestuj dynamiczne odświeżanie konfiguracji
- Dodaj zabezpieczenie Basic Auth do Config Server
Powodzenia! Podziel się swoimi wynikami w komentarzach – chętnie pomogę z ewentualnymi problemami.