Nell’articolo Eureka Service Registry è stato introdotto il service registry di Spring nell’architettura dell’applicazione a microservizi calculator presentata nel post Invocazione di Servizi RESTful con RestTemplate. In particolare abbiamo utilizzato l’astrazione DiscoveryClient
per interrogare il registry e recuperare tutte le istanze attiva di un determinato servizio.
In generale in un sistema a microservizi la comunicazione tra i servizi può avvenire in modo diretto, come nel caso appena visto, in cui ogni servizi conosce “dove” sono gli altri, perchè recuperati dal registry server, ed è quindi il client ad invocarli direttamente secondo politiche scelte liberamente. Alternativamente è possibile utilizzare un proxy ed in tale caso il servizio utilizza direttamente tale componente, il quale poi si occupa di bilanciare le chiamate verso le repliche del servizio che si intende invocare.
Spring Ribbon
Nell’ecosistema Spring Cloud il compito del bilanciamento delle richieste tra microservizi è svolto dal framework Ribbon che consente di controllare il comportamento dei client HTTP e TCP. Per includerlo nel progetto è sufficiente inserire nel pom.xml
la dipendenza relativa:
1 2 3 4 |
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> |
Nel caso dei microservizi dell’applicazione calculator la dipendenza è inserita esclusivamente nel progetto calculator che invoca gli altri due servizi: opgenerator e numbergenerator.
L’abilitazione del proxy nel progetto avviene semplicemente inserendo l’annotazione @RibbonClient nella classe di start di Spring Boot.
1 2 3 4 5 6 7 8 |
@RibbonClient( name = "calculator", configuration = RibbonConfiguration.class) // For Ribbon @EnableDiscoveryClient @SpringBootApplication public class CalculatorApplication { public static void main( String[] args ) throws Exception { SpringApplication.run(CalculatorApplication.class, args); } } |
L’annotazione ha come effetto anche l’inserimento nel contesto di Spring di un insieme di bean (la loro implementazione di default) utilizzati da Ribbon per il load balancing. Tali bean sono del tipo:
IClientConfig
: client configuration,ILoadBalancer
: software load balancer,ServerList
: strategia di recupero dei server,Irul
: strategia di load balancing,Iping
: strategia di ping dei server.
Le loro implementazioni di default possono essere sostituite o estese ridefinendole nella classe RibbonConfiguration
citata nell’annotazione @RibbonClient
.
Load Balancing
Per bilanciare le chiamate verso gli altri microservizi è sifficiente annotare il metodo che restituisce il RestTemplate
con @LoadBalanced
. Questo indicherà all’applicazione di utilizzare il bean RibbonLoadBalancerClient
per interagire con i servizi invocati.
1 2 3 4 5 |
@LoadBalanced @Bean public RestTemplate restTemplateBalanced() { return new RestTemplateBuilder().build(); } |
A questo punto per l’invocazione dei servizi non è più necessario utilizzare il DiscoveryClient
di Eureka ma semplicemente il bean RestTemplate
, come era originariamente prima dell’introduzione del Registry Server. Sarà Ribbon questa volta ad utilizzare l’astrazione di Eureka per recuperare le istanze attive del servizio richiesto ed a bilanciare le invocazioni.
1 2 3 |
public String getOperator() { return rest.getForEntity(opertorGeneratorUrl, RandomOperator.class).getBody().getValue(); } |
Codice Sorgente
Il codice sorgente è scaricabile su Github all’url https://github.com/gotamo/spring-microservices.
Per l’esecuzione utilizzate il profilo: eureka, ribbon.