#java #spring-cloud #feign #circuit-breaker #resilience4j
#Ява #весеннее облако #притворяться #автоматический выключатель #отказоустойчивость 4j
Вопрос:
Автоматический выключатель работает, вызывается запасной вариант, но автоматический выключатель не изменяет свое состояние и каждый раз отправляет запрос на отказавшую службу. Попробовал ту же конфигурацию YAML с шаблоном rest — работает правильно.
Притвориться клиентом
@FeignClient( name = MyFeignClient.SERVICE_NAME, url = "https://httpbin.org/", configuration = {FeignClientConfiguration.class}) public interface MyFeignClient { String SERVICE_NAME = "producer-service"; @GetMapping(value = "/status/502") ResponseEntitylt;Stringgt; gerRequest(); }
Резервный класс
public class MyFallback implements MyFeignClient { private final Exception cause; public MyFallback(Exception cause) { this.cause = cause; } public ResponseEntitylt;Stringgt; gerRequest() { if (cause instanceof HttpServerErrorException){ return ResponseEntity.of(Optional.of(cause.getMessage())); } else { return ResponseEntity.of(Optional.of(cause.getMessage())); } } }
Имитация конфигурации клиента
@RequiredArgsConstructor public class FeignClientConfiguration { private final CircuitBreakerRegistry registry; @Bean @Scope("prototype") public Feign.Builder feignBuilder() { CircuitBreaker circuitBreaker = registry.circuitBreaker("producer-service"); FeignDecorators decorators = FeignDecorators.builder() .withCircuitBreaker(circuitBreaker) .withFallbackFactory(MyFallback::new) .build(); return Resilience4jFeign.builder(decorators); } }
Конфигурация автоматического выключателя YAML
resilience4j.circuitbreaker: configs: default: registerHealthIndicator: true slidingWindowType: COUNT_BASED slidingWindowSize: 5 minimumNumberOfCalls: 3 permittedNumberOfCallsInHalfOpenState: 1 automaticTransitionFromOpenToHalfOpenEnabled: true waitDurationInOpenState: 5s failureRateThreshold: 50 eventConsumerBufferSize: 10 writableStackTraceEnabled: true recordExceptions: - org.springframework.web.client.HttpServerErrorException - java.util.concurrent.TimeoutException - java.io.IOException shared: slidingWindowSize: 100 permittedNumberOfCallsInHalfOpenState: 30 waitDurationInOpenState: 1s failureRateThreshold: 50 eventConsumerBufferSize: 10 instances: producer-service: baseConfig: default