Un esempio di bilanciamento del carico con Zuul ed Eureka

1. Panoramica

In questo articolo, vedremo come funziona il bilanciamento del carico con Zuul ed Eureka.

Inoltreremo le richieste a un servizio REST scoperto da Spring Cloud Eureka tramite Zuul Proxy .

2. Configurazione iniziale

Dobbiamo configurare il server / client Eureka come mostrato nell'articolo Spring Cloud Netflix-Eureka.

3. Configurazione di Zuul

Zuul, tra molte altre cose, recupera dalle posizioni dei servizi Eureka e esegue il bilanciamento del carico lato server.

3.1. Configurazione Maven

Innanzitutto, aggiungeremo Zuul Server e la dipendenza Eureka al nostro pom.xml:

 org.springframework.cloud spring-cloud-starter-netflix-zuul   org.springframework.cloud spring-cloud-starter-netflix-eureka-client 

3.2. Comunicazione con Eureka

In secondo luogo, aggiungeremo le proprietà necessarie nel file application.properties di Zuul :

server.port=8762 spring.application.name=zuul-server eureka.instance.preferIpAddress=true eureka.client.registerWithEureka=true eureka.client.fetchRegistry=true eureka.client.serviceUrl.defaultZone=${EUREKA_URI://localhost:8761/eureka} 

Qui stiamo dicendo a Zuul di registrarsi come servizio in Eureka e di funzionare sulla porta 8762.

Successivamente, implementeremo la classe principale con @EnableZuulProxy e @EnableDiscoveryClient. @EnableZuulProxy lo indica come Zuul Server e @EnableDiscoveryClient lo indica come Eureka Client:

@SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient public class ZuulConfig { public static void main(String[] args) { SpringApplication.run(ZuulConfig.class, args); } }

Puntiamo il nostro browser su // localhost: 8762 / routes . Questo dovrebbe mostrare tutti i percorsi disponibili per Zuul scoperti da Eureka:

{"/spring-cloud-eureka-client/**":"spring-cloud-eureka-client"}

Ora comunicheremo con il client Eureka utilizzando il percorso Zuul Proxy ottenuto. Puntare il nostro browser su // localhost: 8762 / spring-cloud-eureka-client / greeting dovrebbe generare una risposta simile a:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

4. Bilanciamento del carico con Zuul

Quando Zuul riceve una richiesta, raccoglie una delle posizioni fisiche disponibili e inoltra le richieste all'istanza di servizio effettiva. L'intero processo di memorizzazione nella cache della posizione delle istanze del servizio e di inoltro della richiesta alla posizione effettiva viene fornito immediatamente senza configurazioni aggiuntive necessarie.

Qui possiamo vedere come Zuul incapsula tre diverse istanze dello stesso servizio:

Internamente, Zuul utilizza Netflix Ribbon per cercare tutte le istanze del servizio dal rilevamento del servizio (Eureka Server).

Osserviamo questo comportamento quando vengono visualizzate più istanze.

4.1. Registrazione di più istanze

Inizieremo eseguendo due istanze (porte 8081 e 8082).

Una volta che tutte le istanze sono attive , possiamo osservare nei log che le posizioni fisiche delle istanze sono registrate in DynamicServerListLoadBalancer e il percorso viene mappato al controller Zuul che si occupa di inoltrare le richieste all'istanza effettiva:

Mapped URL path [/spring-cloud-eureka-client/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController] Client:spring-cloud-eureka-client instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client, current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null Using serverListUpdater PollingServerListUpdater DynamicServerListLoadBalancer for client spring-cloud-eureka-client initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client, current list of Servers=[0.0.0.0:8081, 0.0.0.0:8082], Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:2; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]}, Server stats: [[Server:0.0.0.0:8080; Zone:defaultZone;......], [Server:0.0.0.0:8081; Zone:defaultZone; ......],

Nota: i log sono stati formattati per una migliore leggibilità.

4.2. Esempio di bilanciamento del carico

Navigiamo nel nostro browser su // localhost: 8762 / spring-cloud-eureka-client / greeting alcune volte.

Ogni volta, dovremmo vedere un risultato leggermente diverso:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8082'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

Ogni richiesta ricevuta da Zuul viene inoltrata a un'istanza diversa in modo round robin.

Se avviamo un'altra istanza e la registriamo in Eureka, Zuul la registrerà automaticamente e inizierà a inoltrarle richieste:

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8083'!

Possiamo anche cambiare la strategia di bilanciamento del carico di Zuul con qualsiasi altra strategia Netflix Ribbon - maggiori informazioni su questo possono essere trovate nel nostro articolo Ribbon.

5. conclusione

Come abbiamo visto, Zuul fornisce un singolo URL per tutte le istanze del servizio Rest e esegue il bilanciamento del carico per inoltrare le richieste a una delle istanze in modalità round robin.

Come sempre, il codice completo per questo articolo può essere trovato su GitHub.