resilience4J + Spring 启动 2.x
resilience4J + Spring Boot 2.x
我在 reative API spring 引导应用程序中使用 resilience4j 进行容错。我可以看到所有事件都被视为成功,即使 Mono 是 returning 错误。
服务层
@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 总是 return 404 错误,从而抛出 WSException。当我看到端点下方时,类型始终为 SUCCESS。我错过了什么吗?
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
}
}
你的方法总是returns 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)
。
我在 reative API spring 引导应用程序中使用 resilience4j 进行容错。我可以看到所有事件都被视为成功,即使 Mono 是 returning 错误。
服务层
@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 总是 return 404 错误,从而抛出 WSException。当我看到端点下方时,类型始终为 SUCCESS。我错过了什么吗?
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
}
}
你的方法总是returns 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)
。