Перейти к основному содержимому

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

· 5 мин. чтения

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 .