Следуя руководству по началу работы (https://resilience4j.readme.io/docs/getting-started-3) и демонстрационный проект (https://github.com/resilience4j/resilience4j-spring-boot2-demo) Я хотел протестировать это самостоятельно, создав более простое тестовое приложение.
Вот код:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ServiceConfiguration {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Контроллер:
@RestController
public class ServiceController {
@Autowired
private AlbumService albumService;
@GetMapping("/albums")
ResponseEntity<String> getAlbums() {
return albumService.getAlbums();
}
}
И класс обслуживания:
@Slf4j
@Service
public class AlbumService {
@Autowired
private RestTemplate restTemplate;
@CircuitBreaker(name = "albumService", fallbackMethod = "getDefaultAlbumList")
public ResponseEntity<String> getAlbums() {
String url = MockNeat.secure().probabilites(String.class)
.add(0.7, "https://wrong-url.com")
.add(0.3, "https://jsonplaceholder.typicode.com/albums").val();
return new ResponseEntity<>(restTemplate.getForObject(url, String.class), HttpStatus.OK);
}
private ResponseEntity<String> getDefaultAlbumList(Exception ex) throws URISyntaxException, IOException {
log.info("Recovered: " + ex.getMessage());
return new ResponseEntity<>(new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("fallback-album-list.json").toURI()))), HttpStatus.OK);
}
}
Наконец, вот файл приложения:
resilience4j:
circuitbreaker:
configs:
default:
registerHealthIndicator: true
slidingWindowSize: 10
minimumNumberOfCalls: 5
permittedNumberOfCallsInHalfOpenState: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
waitDurationInOpenState: 5s
failureRateThreshold: 50
eventConsumerBufferSize: 10
instances:
albumService:
baseConfig: default
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
metrics:
distribution:
percentiles-histogram:
http:
server:
request: true
resielence4j:
circuitbreaker:
calls: true
Я ввел случайную ошибку с вероятностью 70% для проверки автоматического выключателя. Однако цепь никогда не размыкается, и я всегда получаю ошибку. Я понятия не имею, что мне не хватает! Любая помощь?