resilience4j Spring Boot 2

Попробуйте простой проект Spring Boot 2 + Resilience4j.

Но столкнулся с проблемой, что автоматический выключатель всегда ЗАКРЫТ, хотя хост-приложение не работает.

Класс обслуживания

@Autowired
private RestTemplate restTemplate;

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

@CircuitBreaker(name = "mainService", fallbackMethod="testFallBack")
public ResponseEntity<String> invokeService(int i) {
    return restTemplate.exchange(
            "http://localhost:9092/", // This service is always down
            HttpMethod.GET,
            null,
            String.class
    );
}

private  ResponseEntity<String> testFallBack(int i, Exception e) {
    return new ResponseEntity<String>("In fallback method", HttpStatus.INTERNAL_SERVER_ERROR);
}

Конфигурация Resilience4J

management.endpoint.health.show-details: always
management.health.circuitbreakers.enabled: true

resilience4j:
  circuitbreaker:
    configs:
      default:
        registerHealthIndicator: true
        minimumNumberOfCalls: 5
        permittedNumberOfCallsInHalfOpenState: 3
        automaticTransitionFromOpenToHalfOpenEnabled: true
        waitDurationInOpenState: 5s
        failureRateThreshold: 50
        eventConsumerBufferSize: 10
    instances:
      mainService:
        baseConfig: default

Служба вызывается несколько раз из контроллера, и я ожидаю, что она будет откат после минимум 5 вызовов, но автоматический выключатель всегда ЗАКРЫТ и для каждого вызова от контроллера служба хоста вызывается и в соединении отказано.

Зависимости: spring-boot-starter-web, resilience4j-spring-boot2, spring-aop, spring-boot-starter-actator

Ранее я опробовал программный подход с использованием CircuitBreakerRegistry и Decorator Function, которые работают, как ожидалось.


person RajaMdu    schedule 07.05.2020    source источник
comment
Не могли бы вы предоставить более подробный контекст. Как вызвать метод invokeService? Из другого класса, из того же класса? Spring AOP не работает, когда invokeService вызывается из того же класса.   -  person Robert Winkler    schedule 08.05.2020


Ответы (1)


Собственно, вы неправильно понимаете параметры автоматического выключателя. См. документацию:

minimumNumberOfCalls, по умолчанию: 100.

Настраивает минимальное количество вызовов, которое требуется (за период скользящего окна), прежде чем CircuitBreaker сможет вычислить частоту ошибок или медленную скорость вызовов.

Например, если значение minimumNumberOfCalls равно 10, необходимо записать не менее 10 вызовов, прежде чем можно будет рассчитать частоту отказов. Если было записано только 9 вызовов, CircuitBreaker не перейдет в режим открытия, даже если все 9 вызовов завершились ошибкой.

slideWindowSize, по умолчанию: 100.

Настраивает размер скользящего окна, которое используется для записи результатов вызовов при закрытии CircuitBreaker.

В вашей конфигурации есть

minimumNumberOfCalls: 5
slidingWindowSize: 100  ## implicitly, because you have not set this parameters

А вы

ожидайте, что он вернется после минимум 5 звонков

Однако автоматический выключатель размыкается после 100 отказов, а не после 5.

person Honza Zidek    schedule 09.10.2020