1

尝试一个简单的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 的编程方法,该方法按预期工作。

4

1 回答 1

2

实际上,您误解了断路器参数。请参阅文档

minimumNumberOfCalls,默认值:100

配置在 CircuitBreaker 计算错误率或慢速调用率之前所需的最小调用次数(每个滑动窗口周期)。

例如,如果 minimumNumberOfCalls 为 10,则必须记录至少 10 次呼叫,然后才能计算失败率。如果仅记录了 9 个呼叫,即使所有 9 个呼叫都失败,CircuitBreaker 也不会转换为打开状态。

滑动窗口大小,默认值:100

配置用于在 CircuitBreaker 关闭时记录调用结果的滑动窗口的大小。

在您的配置中,有

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

和你

期望它在至少 5 次调用后回退

但是,您的断路器在100 次故障后打开,而不是在 5 次后打开。

于 2020-10-09T20:05:30.657 回答