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