Spring Cloud Config

Come descritto nell’articolo Breve Introduzione ai Microservizi in una architettura a microservizi è fondamentale la presenza di un componente che esponga funzionalità di Configuration Management. Nel mondo Spring Cloud tale ruolo è svolto da Spring Cloud Config che fornisce il supporto, sia server che client, per la configurazione di un sistema distribuito attraverso la centralizzazione dei file di configurazione. In questo articolo utilizzeremo il progetto descritto nel post Invocazione di Servizi RESTful con RestTemplate e configureremo un server Spring Cloud Config allo scopo di fornire ai tre microservizi i relativi file di configurazione. Attualmente ciascun microservizio ha il proprio file application.yml di configurazione incapsulato nel pacchetto jar, come mostrato in figura.

Spring Cloud Config è in grado di recuperare i file di configurazione in un repository Git, con il vantaggio di poterli anche versionare, oppure da un’area di memoria criptata grazie all’integrazione con HashiCorp Vault. La componente client del framework si occuperà poi di comunicare col server di configurazione, attraverso i servizi REST esposti da quest’ultimo, per il recupero dei file con le proprietà per la configurazione del microservizio.

Preparazione del Progetto

Spring Cloud Config è una applicazione Spring Boot che, al momento della stesura di tale articolo, è alla versione 2.0.2.RELEASE. Procediamo quindi creando un progetto Maven (senza specificare artifact) ed inseriamo nel pom.xml la dipendenze a parent spring-boot-starter-parent e a Spring Cloud attraverso il Maven BOM (Bill of Materials), così come raccomandato dalla guida ufficiale al fine di garantire la correttezza di tutte le dipendenze. Il pom risultante sarà:

Generazione Git Repository

I file application.yml dei tre microservizi devono essere inseriti all’interno di un repository Git.  A tale scopo devono prima essere rinominati in calculator.yml, opgenerator.ymlnumbergenerator.yml, al fine di distinguerli. Per la configurazione del repository Git che sarà letto da Spring Cloud apriamo una shell di comando ed eseguiamo le seguenti istruzioni:

L’effetto sarà quello di aver generato localmente un repository Git di aver committato i tre file yml.

Configurazione di Spring Config

Le applicazioni Spring Boot utilizzano un file application.yml posizionato nella cartella resources per la loro configurazione. In particolare le proprietà che dobbiamo specificare per Spring Cloud Config sono la porta di ascolto e l’URI del repository Git. Per semplicità puntiamo direttamente al repository Git sul file system.

Infine per abilitare il config manager su Spring Boot sarà sufficiente inserire l’annotation @EnableConfigServer sulla classe di avvio del server.

Per l’avvio del server su può utilizzare l’usuale goal maven per Spring Boot: spring-boot:run.

Configurazione dei Client

Per la configurazione dei client sui tre microservizi dobbiamo innanzitutto inserire nei relativi pom.xml le dipendenze a Spring Cloud Config. Anche in questo caso utilizziamo Maven BOM, quindi inseriamo sia una sezione <dependencyManagement> che una <dependency>:

Successivamente cancelliamo il file application.yml e sostituiamolo con un file bootstrap.yml. Un’applicazione Spring Cloud opera creando un contesto bootstrap, che è un contesto padre per l’applicazione. Tale contesto è avviato prima dell’applicazione ed è responsabile della lettura del file bootstrap.yml che è quindi caricato prima del file application.xml.  Tale meccanismo assicura all’applicazione cloud di leggere il file di configurazione dal config server prima di avviare il microservizio. Il contenuto del file, i tre servizi della nostra applicazione, sarà:

Dove [appname] assumerà per i tre servizi il valore calculator, opgenerator e numbergenerator rispettivamente. La proprietà spring.cloud.config.uri specifica invece la URI a cui rispondono i servizi di Spring Cloud Config.

Non è richiesta alcuna altra configurazione sui client, che possono quindi essere avviati con il solito task spring-boot:run.

Conclusioni

Se osserviamo il file di log del server Spring Config stampato all’avvio troviamo un insieme di URL che vengono esposte dall’applicativo in cui sono presenti dei placeholder: {name}, {prifiles} e {label}.

  • {name} (o {application}) indica il nome dell’applicativo, ovvero culculator, numbergenerator e opgenerator nel nostro caso, ed è configurato sui client per mezzo della property spring.application.name.
  • {prifiles} fa riferimento al profilo utilizzato dall’applicativo client ed è definito nella proprietà spring.profiles.active.
  • {label} nel caso si utilizzi Git può riferirsi al commit id, al nome del branch o del tag.

Proviamo ad esempio ad aprire nel browser la URL http://localhost:8888/opgenerator/master che recupera la configurazione del microservizio opgenerator sul branch master. Si otterrà il json mostrata di seguito in cui sono presenti le proprietà server.port e operators che sono definite nel file di configurazione opgenerator.yml.

Codice Sorgente

Il codice sorgente è scaricabile su Github all’url https://github.com/gotamo/spring-microservices.