Пример распределения нагрузки с Zuul и Eureka

Пример распределения нагрузки с помощью Zuul и Eureka

1. обзор

В этой статье мы рассмотрим, как балансировка нагрузки работает с Zuul и Eureka.

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

2. Начальная настройка

Нам нужно настроитьEureka server/client, как показано в статьеSpring Cloud Netflix-Eureka.

3. Настройка Zuul

Zuul, помимо прочего, выбирает из сервисов Eureka и выполняет балансировку нагрузки на стороне сервера.

3.1. Конфигурация Maven

Сначала мы добавимZuul Server иEureka dependency к нашемуpom.xml:


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


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

3.2. Общение с Эврикой

Во-вторых, мы добавим необходимые свойства в файл Zuulapplication.properties:

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}

Здесь мы говорим Zuul зарегистрировать себя как службу в Eureka и работать на порту 8762.

Затем мы реализуемmain class, где@EnableZuulProxy and @EnableDiscoveryClient. @EnableZuulProxy указывает это как Zuul Server, а@EnableDiscoveryClient указывает это как Eureka Client:

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

Мы укажем в нашем браузереhttp://localhost:8762/routes. Должны появитьсяall the routes available for Zuul, обнаруженныеEureka:

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

Теперь мы будем общаться с клиентом Eureka, используя полученный маршрут Zuul Proxy. Если указать нашему браузеру наhttp://localhost:8762/spring-cloud-eureka-client/greeting, должен появиться примерно такой ответ:

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

4. Балансировка нагрузки с помощью Zuul

When Zuul receives a request, it picks up one of the physical locations available and forwards requests to the actual service instance. Весь процесс кэширования местоположения экземпляров службы и пересылки запроса в фактическое местоположение предоставляется из коробки без дополнительных настроек.

Здесь мы можем увидеть, как Zuul инкапсулирует три разных экземпляра одного и того же сервиса:

image

Внутренне Zuul использует Netflix Ribbon для поиска всех экземпляров службы из службы обнаружения (Eureka Server).

Давайте посмотрим на это поведение, когда вызывается несколько экземпляров.

4.1. Регистрация нескольких экземпляров

Начнем с запуска двух экземпляров (порты 8081 и 8082).

Как только все экземпляры будут запущены, мы можем наблюдать в журналах, что физические местоположения экземпляров зарегистрированы вDynamicServerListLoadBalancer, а маршрут отображается наZuul Controller, который заботится о пересылке запросов к фактическому экземпляру:

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

Примечание: журналы были отформатированы для лучшей читаемости.

4.2. Пример балансировки нагрузки

Давайте несколько раз перейдем в браузере кhttp://localhost:8762/spring-cloud-eureka-client/greeting.

Каждый раз мы должны видеть немного другой результат:

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

Каждый запрос, полученный Зуулем, пересылается в другой экземпляр циклическим образом.

Если мы запустим другой экземпляр и зарегистрируем его в Eureka, Zuul зарегистрирует его автоматически и начнет пересылать запросы к нему:

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

Мы также можем изменить стратегию балансировки нагрузки Zuul на любую другую стратегию Netflix Ribbon - подробнее об этом можно найти в нашей Ribbonarticle.

5. Заключение

Как мы уже видели, Zuul предоставляет один URL-адрес для всех экземпляров службы отдыха и выполняет балансировку нагрузки для пересылки запросов в один из экземпляров в циклическом режиме.

Как всегда, полный код этой статьи можно найти наover on GitHub.