В этом посте мы расскажем, как использовать автоматический выключатель 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”