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

Весенний облачный шлюз с автоматическим выключателем 4j устойчивости

В этом посте мы расскажем, как использовать автоматический выключатель resilience 4j с шлюзом spring cloud для… С тегом resilience 4 j, spring cloud, java, весенний облачный шлюз.

В этом посте мы расскажем, как использовать автоматический выключатель resilience4j с spring cloud gateway для внутренних служб за шлюзом, используя следующее:

В этом посте мы покажем пример того, как вы можете сочетать использование пускателя пружинной загрузки Resilience4j и пускателя автоматического выключателя spring cloud таким образом, вы можете настроить внешне с помощью конфигурации spring свои определения автоматических выключателей, если вы не хотите использовать подход к настройке кода, предоставляемый Spring cloud circuit breaker starter с помощью средств настройки.

Весь пример кода находится в github .

Сначала мы создадим приложение spring cloud gateway с одной конфигурацией маршрута микросервиса, которую мы будем использовать для обеспечения устойчивости автоматического выключателя к нему, применив защиту автоматического выключателя Resilience4j, поэтому мы рассмотрим следующие моменты:

  • Как включить автоматический выключатель устойчивости 4j в Spring cloud Gateway
  • Как мы можем внешне настроить автоматический выключатель определенной устойчивости 4j
  • Как мы можем протестировать его с помощью контейнеров MockServerTest и правильной настройки для него

Как включить автоматический выключатель устойчивости 4j в Spring cloud Gateway:

Вам необходимо добавить следующие зависимости в приложение spring cloud gateway, чтобы включить интеграцию с автоматическим выключателем Resilience4j

        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
            io.github.resilience4j
            resilience4j-spring-boot2
            1.1.0
        
        
            org.springframework.cloud
            spring-cloud-starter-circuitbreaker-reactor-resilience4j
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        

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

spring:
  application:
    name: gateway-service
  output.ansi.enabled: ALWAYS
  cloud:
    gateway:
      routes:
        - id: test-service-withResilient4j
          uri: http://localhost:8091
          predicates:
            - Path=/testService/**
          filters:
            - RewritePath=/testService/(?.*), /$\{path}

Как мы можем внешне настроить автоматический выключатель определенной устойчивости 4j:

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

Пружинный загрузочный стартер resilience4j создаст регистр автоматического выключателя, основанный на вашей внешней конфигурации, затем вы можете ввести его на фабрику resilience4j spring cloud starter, чтобы включить эту интеграцию, и все!

Внешняя конфигурация устойчивости будет выглядеть так:

resilience4j.circuitbreaker:
  configs:
    default:
      slidingWindowSize: 10
      minimumNumberOfCalls: 5
      permittedNumberOfCallsInHalfOpenState: 3
      automaticTransitionFromOpenToHalfOpenEnabled: true
      waitDurationInOpenState: 2s
      failureRateThreshold: 50
      eventConsumerBufferSize: 10
      recordExceptions:
        - org.springframework.web.client.HttpServerErrorException
        - java.io.IOException
      ignoreExceptions:
        - java.lang.IllegalStateException
    shared:
      slidingWindowSize: 100
      permittedNumberOfCallsInHalfOpenState: 30
      waitDurationInOpenState: 1s
      failureRateThreshold: 50
      eventConsumerBufferSize: 10
      ignoreExceptions:
        - java.lang.IllegalStateException
  instances:
    backendA:
      baseConfig: default
    backendB:
      slidingWindowSize: 10
      minimumNumberOfCalls: 10
      permittedNumberOfCallsInHalfOpenState: 3
      waitDurationInOpenState: 1s
      failureRateThreshold: 50
      eventConsumerBufferSize: 10

Интеграция между реестром автоматических выключателей с загрузкой resilience4j и spring cloud ReactiveResilience4JCircuitBreakerFactory будет выполнена следующим образом:

   @Bean
    public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory(CircuitBreakerRegistry circuitBreakerRegistry) {
        ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory = new ReactiveResilience4JCircuitBreakerFactory();
        reactiveResilience4JCircuitBreakerFactory.configureCircuitBreakerRegistry(circuitBreakerRegistry);
        return reactiveResilience4JCircuitBreakerFactory;
    }

Как мы можем протестировать его с помощью контейнеров MockServerTest и правильной настройки для него:

Теперь пришло время протестировать эту интеграцию и посмотреть, как она работает:

  • мы будем использовать контейнеры mockservertest, чтобы имитировать целевую серверную службу, доступную через шлюз
  • мы заглушим некоторые ответы
  • затем запустите тест и просмотрите журналы, чтобы увидеть, как реагирует автоматический выключатель, и, конечно, вы можете получить множество показателей с помощью показателей, поддерживаемых Resilience4j, воздействия и событий

Добавьте следующие зависимости, чтобы включить использование макетного сервера

       
            org.testcontainers
            mockserver
            1.12.3
            test
        
        
            org.mock-server
            mockserver-client-java
            3.10.8
            test
        

Теперь вам нужно настроить запуск тестового контейнера плюс ввести пользовательскую конфигурацию маршрута после запуска макетного сервера:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = {GatewayCircuitBreakerTest.Initializer.class})
public class GatewayCircuitBreakerTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(GatewayCircuitBreakerTest.class);
    private static MockServerContainer mockServerContainer;

    static {
        mockServerContainer = new MockServerContainer();
        mockServerContainer.start();

    }

    static class Initializer
            implements ApplicationContextInitializer {
        public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
            TestPropertyValues.of(
                    "spring.cloud.gateway.routes[0].id=test-service-withResilient4j",
                    "spring.cloud.gateway.routes[0].uri=" + mockServerContainer.getEndpoint(),
                    "spring.cloud.gateway.routes[0].predicates[0]=" + "Path=/testService/**",
                    "spring.cloud.gateway.routes[0].filters[0]=" + "RewritePath=/testService/(?.*), /$\\{path}",
                    "spring.cloud.gateway.routes[0].filters[1].name=" + "CircuitBreaker",
                    "spring.cloud.gateway.routes[0].filters[1].args.name=" + "backendA",
                    "spring.cloud.gateway.routes[0].filters[1].args.fallbackUri=" + "forward:/fallback/testService"
            ).applyTo(configurableApplicationContext.getEnvironment());
        }
    }

    private MockServerClient client = new MockServerClient(mockServerContainer.getContainerIpAddress(), mockServerContainer.getServerPort());
    @Autowired
    private TestRestTemplate template;

    @AfterClass
    public static void close(){
        mockServerContainer.close();
    }
}

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

Рекомендации:

  • Отказоустойчивость 4j:https://resilience4j.readme.io/docs
  • Автоматический выключатель Spring cloud:https://spring.io/projects/spring-cloud-circuitbreaker
  • Весенний облачный шлюз:https://cloud.spring.io/spring-cloud-gateway/reference/html/

Оригинал: “https://dev.to/romeh/spring-cloud-gateway-with-resilience4j-circuit-breaker-4l4f”