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à:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<project ...> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> </parent> <artifactId>configserver</artifactId> <properties> ... <spring-cloud.version>Finchley.RC2</spring-cloud.version> </properties> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <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> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> </project> |
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.yml
e numbergenerator.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:
1 2 3 4 5 6 7 8 |
mkdir config-repo cd config-repo git init ... [copia dei file yml nella cartella config-repo] ... git add . git commit -m 'First commit' |
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.
1 2 3 4 5 6 7 8 |
server: port: 8888 spring: cloud: config: server: git: uri: file://.../config-repo |
Infine per abilitare il config manager su Spring Boot sarà sufficiente inserire l’annotation @EnableConfigServer
sulla classe di avvio del server.
1 2 3 4 5 6 7 |
@EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } } |
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>
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <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> |
1 2 3 4 |
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </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à:
1 2 3 4 5 6 |
spring: application: name: [appname] cloud: config: uri: http://localhost:8888 |
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, ovveroculculator
,numbergenerator
eopgenerator
nel nostro caso, ed è configurato sui client per mezzo della propertyspring.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
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "name": "opgenerator", "profiles": [ "master" ], "label": null, "version": "61e9263fda5cda32159692046e3bf410f8962706", "state": null, "propertySources": [ { "name": "file://.../config-repo/opgenerator.yml", "source": { "server.port": 8082, "operators": "+, -, *, /" } } ] } |
Codice Sorgente
Il codice sorgente è scaricabile su Github all’url https://github.com/gotamo/spring-microservices.