Um exemplo de balanceamento de carga com Zuul e Eureka

Um exemplo de balanceamento de carga com Zuul e Eureka

1. Visão geral

Neste artigo, veremos como funciona o balanceamento de carga com Zuul e Eureka.

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

2. Configuração inicial

Precisamos configurarEureka server/client conforme mostrado no artigoSpring Cloud Netflix-Eureka.

3. Configurando o Zuul

Zuul, entre muitas outras coisas, busca nos locais de serviço Eureka e faz balanceamento de carga no servidor.

3.1. Configuração do Maven

Primeiro, vamos adicionarZuul Server eEureka dependency ao nossopom.xml:


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


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

3.2. Comunicação com Eureka

Em segundo lugar, adicionaremos as propriedades necessárias no arquivoapplication.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}

Aqui, estamos dizendo ao Zuul para se registrar como um serviço no Eureka e executar na porta 8762.

A seguir, implementaremosmain class com@EnableZuulProxy and @EnableDiscoveryClient. @EnableZuulProxy indica isso como Zuul Server e@EnableDiscoveryClient indica isso como Eureka Client:

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

Vamos apontar nosso navegador parahttp://localhost:8762/routes. Isso deve mostrarall the routes available for Zuul que são descobertos porEureka:

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

Agora, vamos nos comunicar com o cliente Eureka usando a rota Zuul Proxy obtida. Apontar nosso navegador parahttp://localhost:8762/spring-cloud-eureka-client/greeting deve gerar uma resposta como:

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

4. Balanceamento de carga com Zuul

When Zuul receives a request, it picks up one of the physical locations available and forwards requests to the actual service instance. Todo o processo de armazenamento em cache da localização das instâncias de serviço e encaminhamento da solicitação para o local real é fornecido pronto para uso, sem a necessidade de configurações adicionais.

Aqui, podemos ver como o Zuul está encapsulando três instâncias diferentes do mesmo serviço:

image

Internamente, o Zuul usa o Netflix Ribbon para procurar todas as instâncias do serviço a partir da descoberta de serviços (Eureka Server).

Vamos observar esse comportamento quando várias instâncias são ativadas.

4.1. Registro de múltiplas instâncias

Começaremos executando duas instâncias (portas 8081 e 8082).

Depois que todas as instâncias estão ativas, podemos observar nos logs que as localizações físicas das instâncias são registradas emDynamicServerListLoadBalancere a rota é mapeada paraZuul Controller, que se encarrega de encaminhar as solicitações para a instância real:

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

Nota: os logs foram formatados para melhor legibilidade.

4.2. Exemplo de balanceamento de carga

Vamos navegar em nosso navegador parahttp://localhost:8762/spring-cloud-eureka-client/greeting algumas vezes.

Cada vez, devemos ver um resultado ligeiramente diferente:

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

Cada solicitação recebida por Zuul é encaminhada para uma instância diferente de maneira round robin.

Se iniciarmos outra instância e a registrarmos no Eureka, o Zuul a registrará automaticamente e começará a encaminhar solicitações para ela:

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

Também podemos mudar a estratégia de balanceamento de carga do Zuul para qualquer outra estratégia Netflix Ribbon - mais sobre isso pode ser encontrado em nosso Ribbonarticle.

5. Conclusão

Como vimos, o Zuul fornece um URL único para todas as instâncias do Serviço de Repouso e faz balanceamento de carga para encaminhar as solicitações para uma das instâncias de maneira round robin.

Como sempre, o código completo deste artigo pode ser encontradoover on GitHub.