显然,我和我的团队面临着与我们的 Spring Boot 应用程序的
application.yml
文件相关的问题。我们尝试解决这个问题三天多了,但仍然无法找出问题所在。
此问题与版本为
application.yml
的 spring-cloud-starter-circuitbreaker-resilience4j
中使用的 2.1.3
有关。与其他库相关的所有其他应用程序属性都工作正常。但是,在我的本地 PC 中,所有测试用例和 Maven 构建均成功,包括 Resilience4J 相关属性。当应用程序部署到 AWS 环境中时,不会读取 Resilience4J 相关属性。
我不知道这是怎么发生的。它在本地环境中运行良好,不适用于 AWS 环境,仅适用于 Resilience4J 相关的应用程序属性。我也会添加我正在使用的应用程序属性。
resilience4j:
circuitbreaker:
instances:
backendA:
registerHealthIndicator: true
slidingWindowSize: 3
minimumNumberOfCalls: 4
permittedNumberOfCallsInHalfOpenState: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
waitDurationInOpenState: 10s
failureRateThreshold: 50
eventConsumerBufferSize: 10
recordExceptions:
- org.springframework.web.client.HttpServerErrorException
- org.springframework.web.client.RestClientException
- java.util.concurrent.TimeoutException
- java.io.IOException
ignoreExceptions:
- org.springframework.web.client.ResourceAccessException
下面还添加了示例代码用法。
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
@Override
public String getRemoteData(boolean isRequestTimeout) {
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("backendTest");
String remoteUrl = url + "circuit-breaker/sample-data";
if (isRequestTimeout) {
remoteUrl = "http://localhost:8090/invalid-endpoint"; //invalid uri
}
String finalRemoteUrl = remoteUrl;
return circuitBreaker.run(
() -> {
log.info("CircuitBreaker Caller Method");
return longTimeoutRestTemplate.getForObject(finalRemoteUrl, String.class);
}
, throwable -> getDefaultList());
}
我正在使用
java 11
并在 maven 3.8.1
平台中使用 windows
进行本地构建。在 AWS 中,我在 java-11-openjdk
平台中使用 amazon-linux
。这个问题可能听起来很奇怪而且不可能,但我没有逻辑解释这是如何以这种方式发生的。请帮我解决这个问题,谢谢。
添加新内容
如果我们声明另一个 java 类来获取这些应用程序属性并创建工厂 bean,那么它就可以工作。
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration1() {
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(4))
.build();
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(10000))
.slidingWindowSize(2)
.build();
return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
.timeLimiterConfig(timeLimiterConfig).build(), "backendTest");
}
本手册
@Bean
创建不是强制性的,图书馆应读取 application.yml
文件并创建 @Bean
工厂。如果缺少上述代码,则会使用默认配置属性创建工厂。
我们正在调查这个问题,但无法真正找出根本原因。然而我们可以克服这个问题。目前我没有合理的解释来支持如何解决这个问题,但无论如何我会在这里提到它,因为如果有人遇到同样的问题,它可能会有所帮助。
从
application.yml
文件中删除以下配置后,我的问题得到解决。
recordExceptions:
- org.springframework.web.client.HttpServerErrorException
- org.springframework.web.client.RestClientException
- java.util.concurrent.TimeoutException
- java.io.IOException
ignoreExceptions:
- org.springframework.web.client.ResourceAccessException
再次,我不知道如何解释修复方法,但在我找出问题之前,这可能会有所帮助。谢谢!