Рубрики
Без рубрики

Весеннее облако: Истрикс

Автор оригинала: Dhananjay Singh.

Обзор

В этой статье мы познакомим вас с Spring Cloud Netflix Hystrix . Это библиотека отказоустойчивости, которая реализует шаблон Автоматический выключатель enterprise – шаблон, предназначенный для предотвращения каскадных сбоев.

В типичной архитектуре микросервиса у нас есть много небольших приложений, работающих отдельно. Довольно часто одна служба вызывает другую службу (может быть несколько) для выполнения определенного запроса. Всегда существует вероятность того, что одна из этих нижестоящих служб не ответит правильно или просто полностью выйдет из строя.

Один сбой может привести к каскадным сбоям, что приведет к слишком большому количеству неудачных сетевых вызовов, потере памяти и замедлению работы главной службы, которая фактически получила запрос.

Принцип схемы автоматического выключателя аналогичен электронике:

В наших домах есть автоматические выключатели, которые следят за любыми сбоями. Когда происходит сбой, он размыкает цепь (отключая цепь) и, таким образом, изолирует область сбоя. Как только вы устраните проблему, вы можете вручную закрыть цепь, щелкнув выключателем. Это предотвратит сгорание вашего дома.

Точно так же Hystrix отслеживает методы для неудачных вызовов нижестоящих служб. Если вызов нижестоящей службы прерывается чаще, чем это разрешено, Hystrix “разомкнет цепь”, изолируя вызовы этой службы.

Мы можем добавить резервный метод, который будет вызван, если цепь разомкнута, что позволит нам восстановить приложение из состояния сбоя. Hystrix автоматически замыкает цепь через определенное время, что дает время для восстановления службы, вышедшей из строя ниже по потоку.

Установка

В этой статье предполагается , что вы уже знакомы с проектом Netflix Eureka, который используется в качестве реестра служб и для балансировки нагрузки.

Вот как выглядит наш серверный сервис:

  • Сервер Эврика : Действует как реестр служб и работает на порту 8761 .
  • Служба рекомендаций : простая служба REST, имеющая единственную конечную точку /рекомендаций и работающая на порту 8070 .
  • Служба пользователей : простая служба REST, имеющая единственную конечную точку /персонализированную/{id} и работающую на порту 8060 .

Служба пользователей внутренне вызывает службу рекомендаций, чтобы получить результат для /персонализированного/{id} :

@RestController
public class UserRestController {

    @Autowired
    RestTemplate restTemplate;

    @GetMapping(value = "/personalized/{id}")
    public Product[] personalized(@PathVariable int id) {
        Product[] result = restTemplate.getForObject("http://recommendation-service/recommendations", Product[].class);
        return result;
    }
}

Давайте запустим все службы, перейдите в своем браузере на сервер Eureka по адресу http://localhost:8761/ :

Теперь давайте протестируем конечную точку службы пользователей, перейдя в браузере в http://localhost:8060/personalized/1 конечная точка:

Теперь, просто чтобы посмотреть, что произойдет, остановите службу рекомендаций и снова нажмите на указанную выше конечную точку:

Итак, у нас есть 500 ответ на ошибку, и это может измениться в зависимости от реализации.

Было бы плохо, если бы это произошло, когда конечный пользователь полагается на наше приложение. А что, если и другая служба тоже ждала ответа?

Чтобы избежать этих ситуаций, давайте продолжим реализацию Hystrix в нашем приложении.

Добавление Hystrix

Чтобы добавить Hystrix в наш пользовательский сервис, нам необходимо импортировать соответствующую зависимость в ваш pom.xml :


    org.springframework.cloud
    spring-cloud-starter-netflix-hystrix

В случае, если вы создаете проект с нуля, вы можете выбрать эту зависимость из Spring Initializr :

Чтобы включить Hystrix, мы должны аннотировать наш основной класс либо @EnableCircuitBreaker , либо @EnableHystrix . Первый вариант позволяет нам реализовать схему автоматического выключателя и с другими технологиями. Последний вариант позволяет нам реализовать схему автоматического выключателя только с помощью Hystrix:

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Теперь мы хотим найти подходящие места для реализации схемы автоматического выключателя. Как только мы найдем точку, которая может выйти из строя, и где мы хотим разорвать цепь, если потребуется, мы добавим к ней @HystrixCommand .

Это обертывает потенциально опасный метод и позволяет нам определить для него резервный вариант и точку останова, используя атрибут резервный метод .

Давайте добавим это в наш .персонализированный() метод:

@GetMapping(value = "/personalized/{id}")
@HystrixCommand(fallbackMethod = "recommendationFallback")
public Product[] personalized(@PathVariable int id) {
    Product[] result = restTemplate.getForObject("http://recommendation-service/recommendations", Product[].class);
    return result;
}

public Product[] recommendationFallback(int id) {
    System.out.println(return new Product[0];
}

В аннотации @HystrixCommand мы добавили атрибут резервного метода , который указывает на резервный метод , который мы хотим запустить. Конечно, этот атрибут должен точно соответствовать имени нашего метода.

Обратите внимание, что тип возвращаемого значения и параметр резервного метода совпадают с исходным методом. Это связано с тем, что резервный метод должен иметь ту же подпись, что и исходный. Хотя вместо того, чтобы возвращать какие-либо фактические данные, мы просто возвращаем пустой массив.

Давайте перестроим и снова запустим службу пользователей. Он будет работать так же, как и раньше, когда служба рекомендаций будет запущена.

Но если мы остановим службу рекомендаций и снова нажмем /персонализированную/{id} конечную точку службы пользователей, мы получим совсем другое сообщение:

Для настройки @HystrixCommand вы можете использовать атрибут Свойства команды со списком @HystrixProperty аннотаций.

Панель мониторинга Hystrix

Hystrix также предоставляет дополнительную функцию для визуального мониторинга всех ваших автоматических выключателей.

Давайте создадим новый проект для этой панели мониторинга. Как всегда, лучший способ начать со скелетного проекта-использовать Spring Initializr.

Выберите предпочитаемую версию Spring Boot, добавьте зависимость “Панель мониторинга Hystrix” и создайте ее как проект Maven:

Чтобы включить его, мы должны добавить аннотацию @EnableHystrixDashboard в наш основной класс:

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardApplication.class, args);
    }
}

Давайте запустим эту службу на порту 9903 и перейдите в свой браузер на http://localhost:9903/hystrix конечная точка:

Добавление потока метрик Hystrix

Чтобы иметь возможность использовать панель мониторинга Hystrix, наши микросервисы с поддержкой резервного копирования должны предоставлять данные на панель мониторинга через поток показателей Hystrix.

Чтобы добавить это в наш пользовательский сервис, нам нужно включить привод зависимость в наш проект:


    org.springframework.boot
    spring-boot-starter-actuator

Кроме того, в вашем application.properties давайте включим поток:

management.endpoints.web.exposure.include= hystrix.stream

При этом /привод/hystrix.stream отображается как конечная точка управления.

Мониторинг потока Hystrix

Нам нужно отслеживать поток метрик hystrix для пользователей. Для этого давайте наберем http://localhost:8060/actuator/hystrix.stream в поле и нажмите “Мониторинг потока” .

В этом потоке вы можете увидеть множество показателей, касающихся конечной точки службы пользователей.

Мониторинг многих приложений с поддержкой Hystrix может быть сложным , поэтому Spring представила еще один проект под названием Turbine , который будет объединять потоки для представления на одной панели мониторинга Hystrix.

Вывод

В этой статье мы рассмотрели, как использовать резервный механизм Hystrix для наших микросервисов, чтобы предотвратить каскадные сбои. Мы также настраиваем потоки показателей Hystrix на панели мониторинга Hystrix для мониторинга показателей для наших конечных точек.

Как всегда, код для примеров, используемых в этой статье, можно найти на Github .