Kolejnym podejściem do konfiguracji aplikacji, jest jej centralizacja w jakiejś usłudze – w serwerze konfiguracji.
Założenie jest bardzo proste. Każda aplikacja przy starcie, podczas uruchomienia, pierwsze co robi to odpytuje serwer konfiguracji. Dopiero po pobraniu konfiguracji, rozpoczyna się właściwe uruchomienia aplikacji. Natomiast sam serwer korzysta z zewnętrznego repozytorium konfiguracji, z którego pobiera i serwuje aktualną konfigurację.
Spring Cloud Config
Spring Cloud Config odpowiada za właśnie takie podejście. Składa się z dwóch części, Spring Cloud Config Server – czyli biblioteki serwerowej, oraz Spring Cloud Config Client – czyli biblioteki dla aplikacji klienckich.
Spring Cloud Config Server
Aby przygotować serwer konfiguracji, najprościej jest po prostu „wyklikać” aplikację z Spring Initializerze w IDE lub na stronie start.spring.io. Tak na prawdę potrzebujemy tylko jedną zależność – Config Server
.
Za pomocą adnotacji @EnableConfigServer
włączamy automatyczną konfigurację komponentów serwera:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
Następnie musimy jeszcze tylko przygotować konfigurację:
spring:
cloud:
config:
server:
git:
uri: "https://github.com/lmonkiewicz/config-example"
search-paths:
- 'config/{application}/'
default-label: 'main'
I to tyle, nasz serwer jest gotowy do wdrożenia i uruchomienia. W odróżnieniu od standardowych aplikacji webowych, domyślnie uruchamia się na porcie 8888.
Możliwości konfiguracji
Serwer konfiguracji może korzystać z różnych tzw. „backendów”, które dostarczają konfigurację. Do wyboru mamy na przykład JDBC, GIT, SVN, Vault czy po prostu system plików. W przypadku konfiguracji powyżej wykorzystaliśmy repozytorium GIT, publicznie dostępne na GitHubie – oczywiście można użyć też zabezpieczonych repozytoriów, wtedy dodatkowo w konfiguracji należy podać klucz lub login i hasło (po szczegóły odsyłam do dokumentacji).
uri
– adres repozytoriumdefault-label
– domyślnybranch
,tag
lubcommit
który ma zostać użyty jeśli klient tego nie określisearch-paths
– ścieżki które mają być uwzględnione podczas wyszukiwania plików konfiguracyjnych w repozytorium, jeśli tego parametru nie określimy przeszukiwany będzie tylko główny folder repozytorium, a wszystkie zagnieżdżone pliki będą dostępne jedynie po podaniu pełnych ścieżek do nich; dodatkowo mamy tutaj możliwość zastosowania placeholderów:{application}
– odpowiadaspring.application.name
,{profile}
– profil z jakim została uruchomiona aplikacja{label}
– label z żądania aplikacji klienckiej (lub domyślny)
Spring Cloud Config Client
Po stronie aplikacji klienckiej mamy analogiczną sytuację. Po pierwsze musimy dodać zależność:
<properties>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Następnym krokiem jest skonfigurowanie pobrania konfiguracji z serwera. Do tego celu musimy użyć pliku konfiguracyjnego Spring Cloud, czyli bootstrap.yml
. Plik ten jest wykorzystywany przed właściwym zainicjalizowaniem Spring Boota, dzięki czemu możemy skonfigurować tutaj parametry dla których wczytanie pliku application.yml
byłoby zbyt późne.
spring:
cloud:
config:
uri: "http://localhost:8888"
profile: "default" # set profile to use when fetching configuration
label: "main" # set Label to use when fetching configuration
application:
name: "application-name"
Najważniejsze parametry tutaj to:
uri
– adres serwera konfiguracjiprofile
– domyślny profil jaki ma być użyty podczas pobierania konfiguracjilabel
– domyślny label jaki ma być użytyspring.application.name
– nazwa aplikacji dla której ma być pobrana konfiguracja
Oczywiście te parametry możemy też podać jako parametry uruchomienia aplikacji z linii komend, możemy użyć zmiennych środowiskowych, możemy to zrobić dowolnie – to co jest tutaj ważne to to żeby zostały one ustawione zanim Spring Boot się zacznie inicjalizować.
Dowolne pliki konfiguracyjne
Jeśli w repozytorium umieścimy też inne pliki niż standardowe konfiguracje Springa, będą one serwowane jako zwykłe pliki tekstowe. Możemy je pobrać za pomocą zwykłego zapytania HTTP GET
, za pomocą CURLa czy dowolnego innego narzędzia.
curl -X GET http://localhost:8888/{application}/{profile}/{label}/file/path
Możemy w ten sposób dodać konfigurację dla logbacka w Springu.
logging:
config: "http://localhost:8888/my-app/default/main/logback.xml"
Dodatkowe informacje
- Dokumentacja Spring Cloud Config
- Repozytorium na GitHubie zawierające przykładowy projekt z serwerem, konfiguracją oraz trzema aplikacjami klienckimi
Artykuły na temat konfiguracji
- Konfiguracja w Kontenerze – wykorzystanie warstw Dockerowych do przechowywania konfiguracji
- Konfiguracja ze zmiennych środowiskowych – wykorzystanie zmiennych środowiskowych do wstrzykiwania parametrów do konfiguracji
- Konfiguracja z serwera konfiguracji – wykorzystanie Spring Cloud Config w celu utworzenia serwera konfiguracji
- 4 sposoby na organizację konfiguracji w repozytorium – porównanie kilku strategii organizacji konfiguracji w repozytorium GIT