1. Вступление
Netflix Ribbon - это облачная библиотека межпроцессного взаимодействия (IPC). Лента в первую очередь предоставляет алгоритмы балансировки нагрузки на стороне клиента.
Помимо алгоритмов балансировки нагрузки на стороне клиента, Ribbon предоставляет и другие функции:
-
Service Discovery Integration - балансировщики нагрузки ленты обеспечивают
Обнаружение услуг в динамических средах, таких как облако. Интеграция с Компонент обнаружения служб Eureka и Netflix включен в ленту библиотека Отказоустойчивость ** - API ленты может динамически определять,
серверы работают и работают в реальной среде и могут обнаруживать те серверы, которые не работают Настраиваемые правила балансировки нагрузки ** - Поддержка ленты
RoundRobinRule , AvailabilityFilteringRule , WeightedResponseTimeRule из коробки, а также поддерживает определение пользовательских правил
API ленты работает на основе концепции, называемой «именованный клиент». При настройке ленты в файле конфигурации нашего приложения мы предоставляем имя для списка серверов, включенных для балансировки нагрузки.
Давайте возьмем это для вращения.
2. Управление зависимостями
API ленты Netflix можно добавить в наш проект, добавив приведенную ниже зависимость в наш pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
Последние библиотеки можно найти в here
3. Пример приложения
Чтобы увидеть работу Ribbon API, мы создаем пример приложения микросервиса с помощью Spring RestTemplate и расширяем его с помощью Netflix Ribbon API вместе с Spring Cloud Netflix API.
Мы будем использовать одну из стратегий балансировки нагрузки ленты, WeightedResponseTimeRule , чтобы включить балансировку нагрузки на стороне клиента между двумя серверами, которые определены для именованного клиента в файле конфигурации в нашем приложении.
4. Конфигурация ленты
API ленты позволяет нам настроить следующие компоненты балансировщика нагрузки:
-
Rule - Логический компонент, который определяет правило балансировки нагрузки, которое мы
используете в нашем приложении ** 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();
}
}
Обратите внимание, как мы использовали правило WeightedResponseTimeRule для определения сервера и механизм PingUrl для определения доступности сервера в режиме реального времени.
Согласно этому правилу каждому серверу присваивается вес в соответствии с его средним временем ответа, чем меньше время отклика, тем меньше вес.
Это правило случайным образом выбирает сервер, где возможность определяется весом сервера.
И PingUrl будет пинговать каждый URL для определения доступности сервера
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 to false ** Определен список серверов, доступных для балансировки нагрузки, в этом
корпус, 2 сервера ** Настроил частоту обновления сервера с помощью ServerListRefreshInterval
6. RibbonClient
Теперь давайте настроим фрагмент основного компонента приложения - где мы используем 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 может определять доступность сервера через постоянный пинг серверов через равные промежутки времени и может пропускать серверы, которые не работают.
В дополнение к этому, он также реализует схему автоматического выключателя для фильтрации серверов на основе указанных критериев.
Шаблон прерывателя цепи сводит к минимуму влияние сбоя сервера на производительность за счет быстрого отклонения запроса к этому серверу, который завершается с ошибкой, без ожидания истечения времени ожидания. Мы можем отключить эту функцию автоматического выключателя, установив для свойства niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped значение false .
Когда все серверы не работают, и, таким образом, ни один сервер не может обслуживать запрос, pingUrl () завершится сбоем, и мы получим исключение java.lang.IllegalStateException с сообщением «Нет доступных экземпляров для обслуживания запроса» .
8. Заключение
В этой статье мы обсудили Netflix Ribbon API и его реализацию в простом примере приложения.
Полный исходный код для описанного выше примера можно найти в GitHub хранилище .