1. Введение
Лента Netflix — это облачная библиотека межпроцессного взаимодействия (IPC). Лента в первую очередь предоставляет алгоритмы балансировки нагрузки на стороне клиента.
Помимо алгоритмов балансировки нагрузки на стороне клиента, Ribbon предоставляет и другие функции:
- Интеграция обнаружения служб . Ленточные балансировщики нагрузки обеспечивают обнаружение служб в динамических средах, таких как облако. Интеграция с компонентом обнаружения сервисов Eureka и Netflix включена в ленточную библиотеку.
- Отказоустойчивость — Ribbon API может динамически определять, работают ли серверы в реальной среде, и может обнаруживать те серверы, которые не работают.
- Настраиваемые правила балансировки нагрузки — лента поддерживает
RoundRobinRule
,AvailabilityFilteringRule
,WeightedResponseTimeRule
из коробки, а также поддерживает определение пользовательских правил.
Ribbon API работает на основе концепции под названием «Именованный клиент». При настройке ленты в файле конфигурации нашего приложения мы указываем имя для списка серверов, включенных для балансировки нагрузки.
Давайте возьмем его за спину.
2. Управление зависимостями
API ленты Netflix можно добавить в наш проект, добавив следующую зависимость в наш файл pom.xml:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
Последние библиотеки можно найти здесь .
3. Пример приложения
Чтобы увидеть работу Ribbon API, мы создаем образец приложения микросервиса с помощью Spring RestTemplate
и улучшаем его с помощью Ribbon API Netflix вместе с Spring Cloud Netflix API.
Мы будем использовать одну из стратегий балансировки нагрузки ленты, WeightedResponseTimeRule
, чтобы включить балансировку нагрузки на стороне клиента между двумя серверами, которые определены для именованного клиента в файле конфигурации, в нашем приложении.
4. Конфигурация ленты
Ribbon 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();
}
}
Обратите внимание, как мы использовали правило WeightedResponseTimeRule
для определения сервера и механизм PingUrl
для определения доступности сервера в режиме реального времени.
Согласно этому правилу, каждому серверу присваивается вес в соответствии с его средним временем отклика, чем меньше время отклика, тем меньший вес. Это правило случайным образом выбирает сервер, где вероятность определяется весом сервера.
И PingUrl
будет пинговать каждый URL, чтобы определить доступность сервера.
5. приложение.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-server»
- Отключен компонент обнаружения службы Eureka, установив для eureka:
enabled
значениеfalse
- Определен список серверов, доступных для балансировки нагрузки, в данном случае 2 сервера
- Настроил частоту обновления сервера с помощью
ServerListRefreshInterval.
6. Ленточный клиент
Давайте теперь настроим фрагмент основного компонента приложения, где мы используем RibbonClient
для включения балансировки нагрузки вместо простого RestTemplate
:
@SpringBootApplication
@RestController
@RibbonClient(
name = "ping-a-server",
configuration = RibbonConfiguration.class)
public class ServerLocationApp {
@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);
}
}
А вот конфигурация RestTemplate
:
@Configuration
public class RestTemplateConfiguration{
@LoadBalanced
@Bean
RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
Мы определили класс контроллера с аннотацией @RestController
; мы также аннотировали класс @RibbonClient
с именем и классом конфигурации.
Класс конфигурации, который мы определили здесь, — это тот же класс, который мы определили ранее, в котором мы предоставили желаемую конфигурацию Ribbon API для этого приложения.
Обратите внимание, что мы аннотировали RestTemplate
с помощью @LoadBalanced
, что предполагает, что мы хотим, чтобы это было сбалансировано по нагрузке и в этом случае с лентой.
7. Отказоустойчивость в ленте
Как мы обсуждали ранее в этой статье, Ribbon API не только предоставляет алгоритмы балансировки нагрузки на стороне клиента, но и обеспечивает отказоустойчивость.
Как указывалось ранее, Ribbon API может определять доступность сервера посредством постоянного опроса серверов через регулярные промежутки времени и имеет возможность пропускать серверы, которые не работают.
В дополнение к этому, он также реализует шаблон прерывателя цепи для фильтрации серверов на основе заданных критериев.
Шаблон прерывателя цепи сводит к минимуму влияние сбоя сервера на производительность, быстро отклоняя запрос к этому серверу, который дает сбой, не дожидаясь тайм-аута. Мы можем отключить эту функцию прерывателя цепи, установив для свойства niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped
значение false
.
Когда все серверы отключены, то есть нет доступных серверов для обслуживания запроса, pingUrl()
завершится ошибкой, и мы получим исключение java.lang.IllegalStateException
с сообщением «Нет доступных экземпляров для обслуживания запроса»
.
8. Заключение
В этой статье мы обсудили API ленты Netflix и его реализацию в простом примере приложения.
Полный исходный код описанного выше примера можно найти в репозитории GitHub .