I microservizi rappresentano una forma di architettura software la cui idea di base è quella di realizzare applicazioni costituite da servizi indipendenti, di piccole dimensioni, che comunicano tra loro.
Le architetture tradizionali, o monolitiche, vengono eseguite come un singolo servizio e hanno vari livelli applicativi fortemente collegati tra loro. Se un livello sperimenta un qualsiasi tipo di problema spesso è necessario intervenire sull'intera architettura. Aggiungere o migliorare una funzionalità diventa complesso, il software tende a crescere di dimensioni e le sue
parti tendono ad essere difficoltose da individuare e manutenere.
Tale complessità rende più difficile implementare nuove funzionalità. Le architetture monolitiche rappresentano poi un rischio per la disponibilità dell'applicazione poichè la presenza di numerosi livelli dipendenti e collegati aumenta l'impatto di un errore in un processo.
Con i microservizi un'applicazione è realizzata da componenti indipendenti che eseguono ciascun livello applicativo come un servizio. I servizi comunicano attraverso un'interfaccia che utilizza API leggere, tipicamente servizi Rest. Essendo eseguito in modo autonomo ciascun servizio può essere aggiornato, distribuito e ridimensionato indipendentemente dagli altri.
Un'architettura come questa appare predisposta ad evoluzioni e manutenzioni non difficoltose, vedremo quindi come realizzare un primo microservizo in Quarkus.
Il microservizio Quarkus
Utilizzando l'IDE Intellij ed il plug-in Quarkus vediamo come realizzare un microservizio che utilizzi JAX-RS riprendendo l'esempio del convertitore di valuta visto in precedenza. Creiamo un nuovo progetto Quarkus con impostazioni di default e definiamone i parametri Maven:
Nella schermata successiva applichiamo un check in corrispondenza delle API Jax-RS e Jackson nell'area Web del wizard e concludiamo la creazione del progetto:
Il progetto creato è funzionante nonostante Intellij avvisi con segnalazione sul file pom.xml
dell'impossibilità di recuperare alcuni plug-in e la variabile di ambiente della Maven Home. Una configurazione più accurata di Intellij risolverà tali anomalie:
- Da "File" scegliamo "Settings".
- Espandiamo "Build-Execution-Deployment-Build Tools-Maven".
- Check su "Use plugin registry".
- Click su "OK".
- Da "File" clicchiamo su "Invalidate Caches / Restart".
- Scegliamo "Invalidate and Restart".
Possiamo ora correggere i problemi della definizione della Maven Home e delle dipendenze di plug-in. Nell'area "properties" di pom.xml
inseriamo il percorso della Maven Home:
<maven.home>/home/osboxes/.m2/wrapper/dists/apache-maven-3.6.3-bin/1iopthnavndlasol9gbrbg6bf2/apache-maven-3.6.3</maven.home>
Si tratta di un percorso indicativo che può variare da ambiente ad ambiente, occorre tener traccia dell'installazione Maven che si sta utilizzando.
Proseguiamo aggiungendo le dipendenze necessarie all'interno dell'area "dependencies" del file pom.xml
:
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.1</version>
</dependency>
Eseguiamo infine il comando Maven mvn -U idea:idea
dal terminale Intellij per forzare il download delle dipendenze e applichiamo un "Invalidate Caches / Restart".
Il codice del servizio Rest
Per il nostro progetto definiamo un package it.html
in cui inserire la classe del servizio Rest per la conversione di valuta:
package it.html;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/currencyService")
public class CurrencyConverter {
@GET
@Path("euro/{euro}")
@Produces(MediaType.APPLICATION_JSON)
public float dollarToEuro(@PathParam(value = "euro") float euro) {
Conversion conversion = new Conversion(euro * 1.19f, euro);
return conversion.getDollar();
}
@GET
@Path("dollar/{dollar}")
@Produces(MediaType.APPLICATION_JSON)
public float euroToDollar(@PathParam(value = "dollar") float dollar) {
Conversion conversion = new Conversion(dollar, dollar / 1.19f);
return conversion.getEuro();
}
public static class Conversion {
private float euro;
private float dollar;
public Conversion(float dollar, float euro) {
this.euro = euro;
this.dollar = dollar;
}
public void setEuro(float euro) { this.euro = euro;}
public float getEuro(){ return euro;}
public float getDollar() { return dollar; }
}
}
La realizzazione del microservizio è completa. Per avviare l'applicazione posizioniamoci nella sezione "Maven" di Intellij ed eseguiamo quarkus:dev
. Un esempio di chiamata da browser del microservizio Rest per la conversione euro-dollaro è mostrato in Figura 3:
Nei prossimi articoli analizzeremo la struttura del progetto creata da Quarkus introducendo ulteriori aspetti.