Un exemple d'équilibrage de charge avec Zuul et Eureka

1. Vue d'ensemble

Dans cet article, nous verrons comment l'équilibrage de charge fonctionne avec Zuul et Eureka.

Nous acheminerons les demandes vers un service REST découvert par Spring Cloud Eureka via Zuul Proxy .

2. Configuration initiale

Nous devons configurer le serveur / client Eureka comme indiqué dans l'article Spring Cloud Netflix-Eureka.

3. Configuration de Zuul

Zuul, entre autres, récupère les emplacements de service Eureka et effectue un équilibrage de charge côté serveur.

3.1. Configuration Maven

Tout d'abord, nous allons ajouter les dépendances Zuul Server et Eureka à notre pom.xml:

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

3.2. Communication avec Eureka

Deuxièmement, nous ajouterons les propriétés nécessaires dans le fichier application.properties de 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} 

Ici, nous disons à Zuul de s'enregistrer en tant que service dans Eureka et de fonctionner sur le port 8762.

Ensuite, nous implémenterons la classe principale avec @EnableZuulProxy et @EnableDiscoveryClient. @EnableZuulProxy l' indique en tant que serveur Zuul et @EnableDiscoveryClient l' indique en tant que client Eureka:

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

Nous pointerons notre navigateur vers // localhost: 8762 / routes . Cela devrait afficher toutes les routes disponibles pour Zuul qui sont découvertes par Eureka:

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

Nous allons maintenant communiquer avec le client Eureka en utilisant la route Zuul Proxy obtenue. Pointer notre navigateur sur // localhost: 8762 / spring-cloud-eureka-client / salutation devrait générer la réponse quelque chose comme:

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

4. Équilibrage de charge avec Zuul

Lorsque Zuul reçoit une demande, il récupère l'un des emplacements physiques disponibles et transmet les demandes à l'instance de service réelle. L'ensemble du processus de mise en cache de l'emplacement des instances de service et de transmission de la demande à l'emplacement réel est fourni prêt à l'emploi sans aucune configuration supplémentaire nécessaire.

Ici, nous pouvons voir comment Zuul encapsule trois instances différentes du même service:

En interne, Zuul utilise le ruban Netflix pour rechercher toutes les instances du service à partir de la découverte de service (serveur Eureka).

Observons ce comportement lorsque plusieurs instances sont mises en place.

4.1. Enregistrement de plusieurs instances

Nous allons commencer par exécuter deux instances (ports 8081 et 8082).

Une fois que toutes les instances sont actives, nous pouvons observer dans les journaux que les emplacements physiques des instances sont enregistrés dans DynamicServerListLoadBalancer et que la route est mappée vers Zuul Controller qui se charge de transmettre les requêtes à l'instance réelle:

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; ......],

Remarque: les journaux ont été formatés pour une meilleure lisibilité.

4.2. Exemple d'équilibrage de charge

Navigons dans notre navigateur vers // localhost: 8762 / spring-cloud-eureka-client / salutation plusieurs fois.

A chaque fois, on devrait voir un résultat légèrement différent:

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'!

Chaque demande reçue par Zuul est transmise à une instance différente de manière circulaire.

Si nous démarrons une autre instance et l'enregistrons dans Eureka, Zuul l'enregistrera automatiquement et commencera à lui transmettre les requêtes:

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

Nous pouvons également changer la stratégie d'équilibrage de charge de Zuul en toute autre stratégie de ruban Netflix - vous trouverez plus d'informations à ce sujet dans notre article sur le ruban.

5. Conclusion

Comme nous l'avons vu, Zuul fournit une URL unique pour toutes les instances du service de repos et effectue un équilibrage de charge pour transférer les requêtes vers l'une des instances de manière circulaire.

Comme toujours, le code complet de cet article est disponible sur GitHub.