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

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 хранилище .