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

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.

We’ll route requests to a REST Service discovered by Spring Cloud Eureka through Zuul Proxy.

2. La configuration initiale

Nous devons configurerEureka server/client comme indiqué dans l'articleSpring Cloud Netflix-Eureka.

3. Configuration de Zuul

Zuul, entre autres, va chercher dans les points de service Eureka et effectue l’équilibrage de la charge côté serveur.

3.1. Configuration Maven

Tout d'abord, nous allons ajouterZuul Server etEureka dependency à nospom.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 fichierapplication.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:http://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 allons implémenter lemain class avec@EnableZuulProxy and @EnableDiscoveryClient. @EnableZuulProxy indique ceci comme serveur Zuul et@EnableDiscoveryClient indique cela comme client Eureka:

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

Nous pointerons notre navigateur vershttp://localhost:8762/routes. Cela devrait afficher lesall the routes available for Zuul qui sont découverts parEureka:

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

Maintenant, nous allons communiquer avec le client Eureka en utilisant la route Zuul Proxy obtenue. Pointer notre navigateur surhttp://localhost:8762/spring-cloud-eureka-client/greeting devrait générer la réponse quelque chose comme:

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

4. Equilibrage de charge avec Zuul

When Zuul receives a request, it picks up one of the physical locations available and forwards requests to the actual service instance. 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 sans aucune configuration supplémentaire.

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

image

En interne, Zuul utilise Netflix Ribbon pour rechercher toutes les instances du service à partir de la découverte du 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 dansDynamicServerListLoadBalancer et la route est mappée à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 plusieurs fois dans notre navigateur vershttp://localhost:8762/spring-cloud-eureka-client/greeting.

À chaque fois, nous devrions 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 à tour de rôle.

Si nous commençons une autre instance et l'enregistrons dans Eureka, Zuul l'enregistrera automatiquement et commencera à lui transmettre les demandes:

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 - plus d'informations à ce sujet peuvent être trouvées dans notre rubanarticle.

5. Conclusion

Comme nous l’avons vu, Zuul fournit une URL unique pour toutes les instances du service Rest et équilibre la charge afin de transférer les demandes à l’une des instances de manière alternée.

Comme toujours, le code complet de cet article se trouveover on GitHub.