resilience4J + Spring Boot 2.x - PullRequest
       78

resilience4J + Spring Boot 2.x

0 голосов
/ 18 февраля 2019

Я использую resilience4j для отказоустойчивости в приложении пружинной загрузки reative API.Я вижу, что все события рассматриваются как успешные, даже если 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
    }

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

Я намеренно изменил путь 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
}
}

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Предстоящая версия Resilience4j версии 0.14.0 будет поддерживать Mono при использовании аннотации следующим образом: @CircuitBreaker(name = "member-service", type = ApiType.WEBFLUX).

0 голосов
/ 19 февраля 2019

Ваш метод всегда возвращает Mono.Даже если есть ошибка.И @CircuitBreaker аннотация реагирует на исключение (не ошибка 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));
    }
}

Вам нужно resilience4j-reactor и resilience4j-spring-boot2 зависимостей.

...