Рубрики
Без рубрики

Введение в клиент Spring Cloud Rest с лентой Netflix

Введение в клиент Spring Cloud Rest с лентой Netflix с примерами балансировки нагрузки и отказоустойчивости расширенной панели RestTemplate с лентой.

Автор оригинала: baeldung.

1. введение

Netflix Ribbon – это облачная библиотека межпроцессной связи (IPC). Лента в основном предоставляет алгоритмы балансировки нагрузки на стороне клиента.

Помимо алгоритмов балансировки нагрузки на стороне клиента, лента предоставляет также другие функции:

  • Интеграция обнаружения служб – Ленточные балансировщики нагрузки обеспечивают обнаружение служб в динамических средах, таких как облако. Интеграция с компонентом обнаружения служб Eureka и Netflix включена в библиотеку лент
  • Отказоустойчивость – API ленты может динамически определять, работают ли серверы в режиме реального времени, и может обнаруживать те серверы, которые не работают
  • Настраиваемые правила балансировки нагрузки – Лента поддерживает RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule из коробки, а также поддерживает определение пользовательских правил

API ленты работает на основе концепции, называемой “Именованный клиент”. При настройке ленты в нашем файле конфигурации приложения мы указываем имя для списка серверов, включенных для балансировки нагрузки.

Давайте прокатимся.

2. Управление Зависимостями

API ленты Netflix можно добавить в наш проект, добавив нижеприведенную зависимость к вашему pom.xml:


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

Последние библиотеки можно найти здесь .

3. Пример применения

Чтобы увидеть работу API ленты, мы создаем простое приложение микросервиса с помощью Spring RestTemplate и улучшаем его с помощью API ленты Netflix вместе с API Netflix Spring Cloud.

Мы будем использовать одну из стратегий балансировки нагрузки ленты, Правило взвешенного времени отклика , чтобы включить в нашем приложении балансировку нагрузки на стороне клиента между 2 серверами, которые определены под именем клиента в файле конфигурации.

4. Конфигурация ленты

API ленты позволяет нам настроить следующие компоненты балансировщика нагрузки:

  • Правило – Логический компонент, определяющий правило балансировки нагрузки, которое мы используем в нашем приложении
  • Ping – Компонент, определяющий механизм, который мы используем для определения доступности сервера в режиме реального времени
  • ServerList – может быть динамическим или статическим. В нашем случае мы используем статический список серверов и, следовательно, определяем их непосредственно в файле конфигурации приложения

Давайте напишем простую конфигурацию для библиотеки:

public class RibbonConfiguration {

    @Autowired
    IClientConfig ribbonClientConfig;

    @Bean
    public IPing ribbonPing(IClientConfig config) {
        return new PingUrl();
    }

    @Bean
    public IRule ribbonRule(IClientConfig config) {
        return new WeightedResponseTimeRule();
    }
}

Обратите внимание, как мы использовали правило Взвешенного времени отклика для определения сервера и механизм PingUrl для определения доступности сервера в режиме реального времени.

Согласно этому правилу, каждому серверу присваивается вес в соответствии с его средним временем отклика, меньшее время отклика дает меньший вес. Это правило случайным образом выбирает сервер, где возможность определяется весом сервера.

И Url-адрес Ping будет пинговать каждый URI, чтобы определить доступность сервера.

5. application.yml

Ниже приведен файл конфигурации application.yml , который мы создали для этого примера приложения:

spring:
  application:
    name: spring-cloud-ribbon

server:
  port: 8888

ping-server:
  ribbon:
    eureka:
      enabled: false
    listOfServers: localhost:9092,localhost:9999
    ServerListRefreshInterval: 15000

В приведенном выше файле мы указали:

  • Имя приложения
  • Номер порта приложения
  • Именованный клиент для списка серверов: “ping-сервер”
  • Отключите компонент обнаружения службы Eureka, установив eureka: enabled в false
  • Определен список серверов, доступных для балансировки нагрузки, в данном случае 2 сервера
  • Настройка частоты обновления сервера с интервалом обновления списка серверов

6. Ленточный клиент

Теперь давайте настроим фрагмент основного компонента приложения – где мы используем RibbonClient для включения балансировки нагрузки вместо простого RestTemplate :

@SpringBootApplication
@RestController
@RibbonClient(
  name = "ping-a-server",
  configuration = RibbonConfiguration.class)
public class ServerLocationApp {

    @LoadBalanced
    @Bean
    RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/server-location")
    public String serverLocation() {
        return this.restTemplate.getForObject(
          "http://ping-server/locaus", String.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(ServerLocationApp.class, args);
    }
}

Мы определили класс контроллера с аннотацией @RestController ; мы также аннотировали класс с помощью @RibbonClient с именем и классом конфигурации.

Класс конфигурации, который мы определили здесь, является тем же классом, который мы определили ранее, в котором мы предоставили желаемую конфигурацию API ленты для этого приложения.

Обратите внимание, что мы также аннотировали RestTemplate с @LoadBalanced , что говорит о том, что мы хотим, чтобы это было сбалансировано по нагрузке, и в данном случае с лентой.

7. Отказоустойчивость ленты

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

Как указывалось ранее, Ribbon API может определять доступность сервера с помощью постоянного пинга серверов через регулярные промежутки времени и имеет возможность пропускать серверы, которые не работают.

В дополнение к этому, он также реализует шаблон автоматического выключателя для фильтрации серверов на основе заданных критериев.

Шаблон автоматического выключателя сводит к минимуму влияние сбоя сервера на производительность, быстро отклоняя запрос на этот сервер, который выходит из строя, не дожидаясь тайм-аута. Мы можем отключить эту функцию автоматического выключателя, установив свойство news.loadbalancer.availability Filtering Rule.filterCircuitTripped в false .

Когда все серверы не работают, поэтому ни один сервер не доступен для обслуживания запроса, pingUrl() завершится ошибкой, и мы получим исключение java.lang.IllegalStateException с сообщением “Экземпляры недоступны для обслуживания запроса” .

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

В этой статье мы обсудили API ленты Netflix и его реализацию в простом примере приложения.

Полный исходный код для примера, описанного выше, можно найти в репозитории GitHub .