Konfiguracja z serwera konfiguracji

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ę.

Diagram komunikacji aplikacji i serwera

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 repozytorium
  • default-label – domyślny branch, tag lub commit który ma zostać użyty jeśli klient tego nie określi
  • search-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} – odpowiada spring.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 konfiguracji
  • profile – domyślny profil jaki ma być użyty podczas pobierania konfiguracji
  • label – domyślny label jaki ma być użyty
  • spring.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


Artykuły na temat konfiguracji