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

Краткое руководство по весеннему облачному выключателю

Выключатели цепи позволяют грациозно обрабатывать ошибки. Spring Cloud теперь поддерживает несколько библиотек выключателей с одним интерфейсом.

Автор оригинала: Catalin Burcea.

1. Обзор

В этом учебнике Мы представим проект Spring Cloud Circuit Breaker и узнать, как мы можем использовать его.

Во-первых, мы увидим, что предлагает Spring Cloud Circuit Breaker в дополнение к существующим реализациям выключателей. Далее мы узнаем, как использовать механизм автоматической конфигурации Spring Boot для интеграции одного или нескольких выключателей в наше приложение.

Обратите внимание, что у нас есть больше информации о том, что выключатель цепи и как они работают во введении к Hystrix , Весеннее облако Netflix Hystrix , и руководство по resilience4j .

2. Весенний облачный выключатель

До недавнего времени Spring Cloud предоставлял нам только один способ добавления выключателей в наши приложения. Это произошло благодаря использованию Netflix Hystrix в рамках проекта Spring Cloud Netflix.

Проект Spring Cloud Netflix на самом деле просто библиотека обертки на основе аннотации вокруг Hystrix. Таким образом, эти две библиотеки тесно связаны между собой. Это означает, что мы не можем переключиться на другую реализацию выключателя без изменения приложения.

Проект Spring Cloud Circuit Breaker решает эту проблему. Он обеспечивает слой абстракции в различных реализациях выключателя. Это подключаемая архитектура. Таким образом, мы можем код против предоставленной абстракции/интерфейс и переключиться на другую реализацию на основе наших потребностей.

Для наших примеров, Мы сосредоточимся только на реализации Resilience4J. Тем не менее, эти методы могут быть использованы для других плагинов.

3. Автоматическая конфигурация

Для того, чтобы использовать конкретные реализации выключателя цепи в нашем приложении, мы должны добавить соответствующий стартовый Spring. В нашем случае, давайте использовать весна-облако-стартер-замыкание-устойчивость4j :


    org.springframework.cloud
    spring-cloud-starter-circuitbreaker-resilience4j
    1.0.2.RELEASE

Механизм автоматической конфигурации настраивает необходимые бобы выключателя цепи если он видит один из стартеров в classpath.

Если бы мы хотели отключить автоматическую конфигурацию Resilience4J, мы могли бы установить spring.cloud.circuitbreaker.resilience4j.enabled имущество для ложные .

4. Простой пример выключателя цепи

Давайте создадим веб-приложение с использованием Spring Boot, чтобы мы можно было узнать, как работает библиотека Spring Cloud Circuit Breaker.

Мы построим простой веб-сервис, возвращающий список альбомов. Допустим, необработанный список предоставляется сторонняя служба. Для простоты мы будем использовать внешний манекен API, предоставляемый Jsonplaceholder для получения списка:

https://jsonplaceholder.typicode.com/albums

4.1. Создание выключателя цепи

Давайте создадим наш первый выключатель. Начнем с введения экземпляра CircuitBreakerFactory боб:

@Service
public class AlbumService {
    
    @Autowired
    private CircuitBreakerFactory circuitBreakerFactory;

    //... 

}

Теперь мы можем легко создать выключатель с помощью CircuitBreakerFactory’create метод. В качестве аргумента требуется идентификатор выключателя цепи:

CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");

4.2. Оберните задачу в выключателе цепи

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "https://jsonplaceholder.typicode.com/albums";

    return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class));
}

Выключатель цепи работает наш метод для нас и обеспечивает толерантность к ошибкам.

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

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "http://localhost:1234/not-real";
    
    return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class), 
      throwable -> getDefaultAlbumList());
}

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

В этом случае мы не будем принимать во внимание исключение. Мы просто вернем кэшированный список альбомов.

Если внешний вызов заканчивается с исключением и не предоставляется откат, NoFallbackДоступныйИсключаемый брошен весной.

4.3. Построить контроллер

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

@RestController
public class Controller {

    @Autowired
    private Service service;

    @GetMapping("/albums")
    public String albums() {
        return service.getAlbumList();
    }

}

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

[GET] http://localhost:8080/albums

5. Глобальная пользовательская конфигурация

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

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

Здесь мы определим глобальную конфигурацию для всех выключателей. По этой причине мы должны определить Настраиватель фасоль . Так что давайте использовать Устойчивость4JCircuitBreakerFactory реализация.

Во-первых, мы определим классы конфигурации выключателя и ограничитежа по времени в соответствии с учебником Resilience4j:

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
  .failureRateThreshold(50)
  .waitDurationInOpenState(Duration.ofMillis(1000))
  .slidingWindowSize(2)
  .build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
  .timeoutDuration(Duration.ofSeconds(4))
  .build();

Далее давайте встраиваем конфигурацию в Настраиватель фасоли с помощью Resilience4JCircuitBreakerFactory.configureDefault метод:

@Configuration
public class Resilience4JConfiguration {
    @Bean
    public Customizer globalCustomConfiguration() {
        
        // the circuitBreakerConfig and timeLimiterConfig objects

        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
          .timeLimiterConfig(timeLimiterConfig)
          .circuitBreakerConfig(circuitBreakerConfig)
          .build());
    } 
}

6. Конкретная пользовательская конфигурация

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

Аналогичным образом, мы можем определить один или несколько Настраиватель фасоль. Затем мы можем предоставить различную конфигурацию для каждого из них с помощью Resilience4JCircuitBreakerFactory.configure метод:

@Bean
public Customizer specificCustomConfiguration1() {

    // the circuitBreakerConfig and timeLimiterConfig objects

    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
      .timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker");
}

Здесь мы предоставляем второй параметр, идентификатор выключателя, который мы настраиваем.

Мы также можем настроить несколько выключателей с одинаковой конфигурацией, предоставив список идентификаторов выключателей к одному и тому же методу:

@Bean
public Customizer specificCustomConfiguration2() {

    // the circuitBreakerConfig and timeLimiterConfig objects

    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
      .timeLimiterConfig(timeLimiterConfig).build(),
        "circuitBreaker1", "circuitBreaker2", "circuitBreaker3");
}

7. Альтернативные реализации

Мы видели, как использовать Устойчивость4j реализации для создания одного или несколько выключателей с spring Cloud Circuit Breaker.

Тем не менее, есть и другие реализации, поддерживаемые Spring Cloud Circuit Breaker, которые мы можем использовать в нашем приложении:

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

Вышеуказанные библиотеки имеют больше возможностей, чем мы исследовали здесь. Тем не менее, Spring Cloud Circuit Breaker является абстракцией только над частью выключателя. Например, Resilience4j также предоставляет другие модули, такие как ТарифЛимитер , Балкхед , Повторить в дополнение к Схема CircuitBreaker и ТаймЛимитер модули, используемые в данной статье.

8. Заключение

В этой статье мы обнаружили проект Spring Cloud Circuit Breaker.

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

Далее мы использовали механизм автоматической конфигурации Spring Boot, чтобы показать, как определить и интегрировать выключатели. Кроме того, мы продемонстрировали, как работает весенний облачный выключатель с помощью простого сервиса REST.

Наконец, мы научились настраивать все выключатели вместе, а также индивидуально.

Как всегда, исходный код для этого учебника доступен более на GitHub .