Ein Beispiel für Lastverteilung mit Zuul und Eureka

Ein Beispiel für Load Balancing mit Zuul und Eureka

1. Überblick

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

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

2. Ersteinrichtung

Wir müssenEureka server/client wie im ArtikelSpring Cloud Netflix-Eureka gezeigt einrichten.

3. Zuul konfigurieren

Zuul ruft unter anderem von Eureka-Servicestandorten ab und führt einen serverseitigen Lastenausgleich durch.

3.1. Maven-Konfiguration

Zuerst addieren wirZuul Server undEureka dependency zu unserenpom.xml:


    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 Zuulsapplication.properties-Datei ein:

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}

Hier fordern wir Zuul auf, sich als Dienst in Eureka zu registrieren und auf Port 8762 zu fahren.

Als Nächstes implementieren wirmain class, wobei@EnableZuulProxy and @EnableDiscoveryClient. @EnableZuulProxy dies als Zuul Server und@EnableDiscoveryClient dies als Eureka Client angibt:

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

Wir verweisen unseren Browser aufhttp://localhost:8762/routes. Dies sollteall the routes available for Zuul anzeigen, die vonEureka: entdeckt werden

{"/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 aufhttp://localhost:8762/spring-cloud-eureka-client/greeting zeigen, wird die Antwort wie folgt generiert:

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

4. Lastausgleich mit Zuul

When Zuul receives a request, it picks up one of the physical locations available and forwards requests to the actual service instance. Der gesamte Prozess des Zwischenspeicherns des Speicherorts der Dienstinstanzen und des Weiterleitens der Anforderung an den tatsächlichen Speicherort wird standardmäßig bereitgestellt, ohne dass zusätzliche Konfigurationen erforderlich sind.

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

image

Intern sucht Zuul mit Netflix Ribbon nach allen Instanzen des Dienstes aus der Dienstermittlung (Eureka Server).

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 beobachten, dass die physischen Speicherorte der Instanzen inDynamicServerListLoadBalancer registriert sind und die RouteZuul Controller zugeordnet ist, wodurch die Weiterleitung von Anforderungen an die tatsächliche Instanz sichergestellt wird:

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: Protokolle wurden zur besseren Lesbarkeit formatiert.

4.2. Beispiel für einen Lastausgleich

Navigieren wir in unserem Browser einige Male zuhttp://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 von Zuul empfangene Anfrage wird in einem Round-Robin-Verfahren an eine andere Instanz weitergeleitet.

Wenn wir eine andere Instanz starten und in Eureka registrieren, registriert Zuul sie automatisch und leitet Anforderungen 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 unseren Ribbonarticle.

5. Fazit

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

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