Пробуем простой проект 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
Ранее я опробовал программный подход c с использованием функции CircuitBreakerRegistry и Decorator который работает как ожидалось.