resilience4J + Spring Boot 2.x
Я использую resilience4j для отказоустойчивости в приложении Reative API Spring Spring. Я вижу, что все события считаются успешными, хотя 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: // локальный: 8088 / выключатель-событие / член-сервис
{
"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
}
}
1 ответ
Ваш метод всегда возвращает 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
зависимостей.
Следующая версия Resilience4j версии 0.14.0 будет поддерживать Mono, когда вы используете аннотацию следующим образом: @CircuitBreaker(name = "member-service", type = ApiType.WEBFLUX)
,