Een voorbeeld van load balancing met Zuul en Eureka

1. Overzicht

In dit artikel gaan we kijken hoe load balancing werkt met Zuul en Eureka.

We sturen verzoeken door naar een REST-service die is ontdekt door Spring Cloud Eureka via Zuul Proxy.

2. Eerste installatie

We moeten opzetten Eureka-server / -client zoals getoond in het artikel Spring Cloud Netflix-Eureka.

3. Zuul configureren

Zuul haalt onder meer uit Eureka-servicelocaties en doet aan server-side load balancing.

3.1. Maven-configuratie

Eerst zullen we toevoegen Zuul Server en Afhankelijkheid van Eureka naar onze pom.xml:

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

3.2. Communicatie met Eureka

Ten tweede zullen we de benodigde eigendommen in Zuul's toevoegen application.properties het dossier:

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} 

Hier vertellen we Zuul dat hij zich als een dienst in Eureka moet registreren en op poort 8762 moet rijden.

Vervolgens implementeren we het hoofdklasse met @EnableZuulProxy en @EnableDiscoveryClient. @EnableZuulProxy geeft dit aan als Zuul Server en @EnableDiscoveryClient geeft dit aan als Eureka Client:

@SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient openbare klasse ZuulConfig {openbare statische leegte hoofd (String [] args) {SpringApplication.run (ZuulConfig.class, args); }}

We zullen onze browser naar // localhost: 8762 / routes. Dit zou moeten verschijnen alle routes beschikbaar voor Zuul die zijn ontdekt door Eureka:

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

Nu zullen we communiceren met de Eureka-klant met behulp van de verkregen Zuul Proxy-route. Wijzend onze browser naar // localhost: 8762 / spring-cloud-eureka-client / groet zou het antwoord moeten genereren als:

Hallo van 'SPRING-CLOUD-EUREKA-CLIENT met poortnummer 8081'!

4. Load balancing met Zuul

Wanneer Zuul een verzoek ontvangt, pikt het een van de beschikbare fysieke locaties op en stuurt het verzoeken door naar de daadwerkelijke service-instantie. Het hele proces van het cachen van de locatie van de service-instances en het doorsturen van het verzoek naar de daadwerkelijke locatie wordt standaard geleverd zonder dat aanvullende configuraties nodig zijn.

Hier kunnen we zien hoe Zuul drie verschillende exemplaren van dezelfde service inkapselt:

Intern gebruikt Zuul Netflix Ribbon om alle instanties van de service op te zoeken vanuit de service discovery (Eureka Server).

Laten we dit gedrag observeren wanneer er meerdere instanties worden genoemd.

4.1. Meerdere instanties registreren

We beginnen met het uitvoeren van twee instanties (poorten 8081 en 8082).

Zodra alle instanties zijn opgestart, kunnen we in logboeken zien dat de fysieke locaties van de instanties zijn geregistreerd in DynamicServerListLoadBalancer en de route is in kaart gebracht Zuul Controller die zorgt voor het doorsturen van verzoeken naar de daadwerkelijke instantie:

Toegewezen URL-pad [/ spring-cloud-eureka-client / **] naar handler van het type [class org.springframework.cloud.netflix.zuul.web.ZuulController] Client: spring-cloud-eureka-client startte een LoadBalancer: DynamicServerListLoadBalancer : {NFLoadBalancer: name = spring-cloud-eureka-client, huidige lijst met servers = [], Load balancer-statistieken = Zone-statistieken: {}, Server-statistieken: []} ServerList: null Met behulp van serverListUpdater PollingServerListUpdater DynamicServerListLoadBalancer voor client spring-cloud -eureka-client geïnitialiseerd: DynamicServerListLoadBalancer: {NFLoadBalancer: name = spring-cloud-eureka-client, huidige lijst met servers = [0.0.0.0:8081, 0.0.0.0:8082], Load balancer-statistieken = Zonestatistieken: {defaultzone = [Zone: defaultzone; Aantal instanties: 2; Aantal actieve verbindingen: 0; Aantal geactiveerde stroomonderbreker: 0; Actieve verbindingen per server: 0.0;]}, Serverstatistieken: [[Server: 0.0.0.0: 8080; Zone: standaard Zone; ......], [Server: 0.0.0.0: 8081; Zone: defaultZone; ......],

Opmerking: logboeken zijn opgemaakt voor betere leesbaarheid.

4.2. Voorbeeld van load-balancing

Laten we een paar keer door onze browser navigeren naar // localhost: 8762 / spring-cloud-eureka-client / groet.

Elke keer zouden we een iets ander resultaat moeten zien:

Hallo van 'SPRING-CLOUD-EUREKA-CLIENT met poortnummer 8081'!
Hallo van 'SPRING-CLOUD-EUREKA-CLIENT met poortnummer 8082'!
Hallo van 'SPRING-CLOUD-EUREKA-CLIENT met poortnummer 8081'!

Elk verzoek dat Zuul ontvangt, wordt doorgestuurd naar een ander exemplaar op een round robin-manier.

Als we een andere instantie starten en deze in Eureka registreren, zal Zuul deze automatisch registreren en verzoeken ernaar doorsturen:

Hallo van 'SPRING-CLOUD-EUREKA-CLIENT met poortnummer 8083'!

We kunnen ook de load-balancing-strategie van Zuul wijzigen in een andere Netflix Ribbon-strategie - meer hierover is te vinden in ons Ribbon-artikel.

5. Conclusie

Zoals we hebben gezien, biedt Zuul een enkele URL voor alle instanties van de Rest-service en voert het load-balancing uit om de verzoeken door te sturen naar een van de instanties in round robin-mode.

Zoals altijd is de volledige code voor dit artikel te vinden op GitHub.