尝试一个简单的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-actuator
早些时候,我尝试了使用 CircuitBreakerRegistry 和 Decorator Function 的编程方法,该方法按预期工作。