弹性4J + Spring Boot 2.x

akr*_*.21 1 circuit-breaker project-reactor spring-webflux resilience4j

我在reative API spring boot应用程序中使用resilience4j进行容错。我可以看到,即使 Mono 返回错误,所有事件都被视为成功。

服务层

    @Override
    @CircuitBreaker(name = "member-service")
    public Mono<String> getMemberInfo(String memberId) {
        return wsClient.getMemberInfo(memberId); 
       // This call will return WSException whenever there is 4XX or 5XX error
    }
Run Code Online (Sandbox Code Playgroud)

application.yml配置

resilience4j.circuitbreaker:
  backends:
    member-service:
      ringBufferSizeInClosedState: 1
      ringBufferSizeInHalfOpenState: 2
      waitInterval: 10000
      failureRateThreshold: 75
      registerHealthIndicator: true
      recordExceptions:
        - com.xx.WSException
      ignoreExceptions:
        - com.xxx.WSClientException
Run Code Online (Sandbox Code Playgroud)

我故意更改了 URI 路径,以便 WebClient 始终返回 404 错误,从而引发 WSException。当我看到下面的端点时,类型总是成功。我错过了什么?

http://localhost:8088/circuitbreaker-events/member-service

{
"circuitBreakerEvents": [
{
"circuitBreakerName": "member-service",
"type": "SUCCESS",
"creationTime": "2019-02-18T21:56:21.588+05:30[Asia/Calcutta]",
"durationInMs": 6
},
{
"circuitBreakerName": "member-service",
"type": "SUCCESS",
"creationTime": "2019-02-18T21:56:21.588+05:30[Asia/Calcutta]",
"durationInMs": 5
},
{
"circuitBreakerName": "member-service",
"type": "SUCCESS",
"creationTime": "2019-02-18T21:56:21.588+05:30[Asia/Calcutta]",
"durationInMs": 6
}
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 6

你的方法总是返回 Mono。即使有错误。并且@CircuitBreaker注释对异常(不是 error Mono)做出反应。

所以你应该申请CircuitBreakerOperator你的反应式代码。

public class MemberService {
    private final WsClient wsClient;
    private final CircuitBreaker circuitBreaker;

    public MemberService(WsClient wsClient,
                         CircuitBreakerRegistry circuitBreakerRegistry,
                         CircuitBreakerProperties circuitBreakerProperties) {
        this.wsClient = wsClient;
        this.circuitBreaker = circuitBreakerRegistry.circuitBreaker(
                "member-service",
                () -> circuitBreakerProperties
                        .createCircuitBreakerConfig("member-service"));
    }

    public Mono<String> getMemberInfo(String memberId) {
        return wsClient.getMemberInfo(memberId)
                .transform(CircuitBreakerOperator.of(circuitBreaker));
    }
}
Run Code Online (Sandbox Code Playgroud)

你需要resilience4j-reactorresilience4j-spring-boot2依赖。

  • 谢谢,之前我尝试过这个没有用的解决方案,因为我是在每个请求上构建断路器,而不是像你提到的那样在创建类实例时构建断路器。再次感谢 (2认同)