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 .