尝试一个简单的Spring 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 Config
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,弹性4j-spring-boot2,spring,spring starter
早些时候,我尝试了使用CircuitBreakerRegistry和Decorator函数的编程方法,它的工作原理与预期一样。
发布于 2020-10-09 20:05:30
实际上,你误解了断路器的参数。见文档
minimumNumberOfCalls,默认值: 100 配置CircuitBreaker计算错误率或慢调用率之前所需的最小调用数(每个滑动窗口周期)。 例如,如果minimumNumberOfCalls为10,则必须记录至少10个呼叫,然后才能计算故障率。如果只记录了9个呼叫,即使所有9个呼叫都失败,CircuitBreaker也不会切换到打开。 slidingWindowSize,默认值: 100 配置滑动窗口的大小,该窗口用于记录CircuitBreaker关闭时调用的结果。
在您的配置中,
minimumNumberOfCalls: 5
slidingWindowSize: 100 ## implicitly, because you have not set this parameters而你
至少在5次呼叫后,它会掉队。
但是,您的断路器在100故障后打开,而不是在5之后打开。
https://stackoverflow.com/questions/61660096
复制相似问题