Ein Beispiel für einen Lastausgleich mit Zuul und Eureka

1. Übersicht

In diesem Artikel werden wir uns ansehen, wie der Lastausgleich mit Zuul und Eureka funktioniert.

Wir leiten Anfragen über Zuul Proxy an einen von Spring Cloud Eureka entdeckten REST-Service weiter .

2. Ersteinrichtung

Wir müssen den Eureka-Server / -Client wie im Artikel Spring Cloud Netflix-Eureka gezeigt einrichten .

3. Zuul konfigurieren

Zuul holt unter anderem Eureka-Servicestandorte ab und führt den serverseitigen Lastausgleich durch.

3.1. Maven-Konfiguration

Zuerst fügen wir unserer pom.xml Zuul Server- und Eureka-Abhängigkeit hinzu :

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

3.2. Kommunikation mit Eureka

Zweitens fügen wir die erforderlichen Eigenschaften in Zuuls Datei application.properties hinzu :

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 fordern wir Zuul auf, sich als Dienst in Eureka zu registrieren und auf Port 8762 zu laufen.

Als nächstes implementieren wir die Hauptklasse mit @EnableZuulProxy und @EnableDiscoveryClient. @EnableZuulProxy gibt dies als Zuul Server an und @EnableDiscoveryClient gibt dies als Eureka Client an:

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

Wir werden unseren Browser auf // localhost: 8762 / route verweisen . Daraufhin sollten alle für Zuul verfügbaren Routen angezeigt werden, die von Eureka entdeckt wurden :

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

Jetzt kommunizieren wir mit dem Eureka-Client über die erhaltene Zuul-Proxy-Route. Wenn Sie unseren Browser auf // localhost: 8762 / spring-cloud-eureka-client / greeting verweisen, sollte die Antwort wie folgt generiert werden:

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

4. Lastausgleich mit Zuul

Wenn Zuul eine Anfrage erhält, nimmt er einen der verfügbaren physischen Standorte auf und leitet Anfragen an die eigentliche Dienstinstanz weiter. Der gesamte Prozess des Zwischenspeicherns des Speicherorts der Dienstinstanzen und des Weiterleitens der Anforderung an den tatsächlichen Speicherort wird sofort bereitgestellt, ohne dass zusätzliche Konfigurationen erforderlich sind.

Hier können wir sehen, wie Zuul drei verschiedene Instanzen desselben Dienstes kapselt:

Intern verwendet Zuul Netflix Ribbon, um nach allen Instanzen des Dienstes aus der Diensterkennung (Eureka Server) zu suchen.

Beobachten wir dieses Verhalten, wenn mehrere Instanzen aufgerufen werden.

4.1. Mehrere Instanzen registrieren

Zunächst werden zwei Instanzen ausgeführt (8081- und 8082-Ports).

Sobald alle Instanzen aktiv sind, können wir in Protokollen feststellen, dass die physischen Speicherorte der Instanzen in DynamicServerListLoadBalancer registriert sind und die Route Zuul Controller zugeordnet ist, der die Weiterleitung von Anforderungen an die tatsächliche Instanz übernimmt:

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

Hinweis: Die Protokolle wurden zur besseren Lesbarkeit formatiert.

4.2. Beispiel für einen Lastausgleich

Navigieren wir in unserem Browser einige Male zu // localhost: 8762 / spring-cloud-eureka-client / greeting.

Jedes Mal sollten wir ein etwas anderes Ergebnis sehen:

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

Jede bei Zuul eingegangene Anfrage wird im Round-Robin-Verfahren an eine andere Instanz weitergeleitet.

Wenn wir eine andere Instanz starten und in Eureka registrieren, registriert Zuul sie automatisch und leitet Anfragen an sie weiter:

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

Wir können Zuuls Lastausgleichsstrategie auch in eine andere Netflix Ribbon-Strategie ändern. Weitere Informationen hierzu finden Sie in unserem Ribbon-Artikel.

5. Schlussfolgerung

Wie wir gesehen haben, stellt Zuul eine einzige URL für alle Instanzen des Rest Service bereit und führt einen Lastausgleich durch, um die Anforderungen im Round-Robin-Verfahren an eine der Instanzen weiterzuleiten.

Wie immer finden Sie den vollständigen Code für diesen Artikel auf GitHub.