繁体   English   中英

Spring 启动应用程序属性未在 AWS 环境中读取

[英]Spring boot application properties are not reading in AWS environment

显然,我和我的团队正面临与我们的 spring 引导应用程序的application.yml文件相关的问题。 我们确实尝试了三天多来解决这个问题,但仍然无法弄清楚出了什么问题。

此问题与版本2.1.3spring-cloud-starter-circuitbreaker-resilience4j中使用的application.yml相关。 与其他库相关的所有其他应用程序属性都可以正常工作。 但是,在我的本地 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并在windows平台中使用maven 3.8.1本地构建。 在 AWS 中,我在amazon-linux平台上使用java-11-openjdk 这个问题可能听起来很奇怪而且不可能,但我没有逻辑解释这是如何以这种方式发生的。 请帮我解决这个问题,谢谢。

要添加的新内容

如果我们声明另一个 java class 来获取这些应用程序属性并创建工厂 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

同样,我不知道如何解释修复,但在我弄清楚问题之前,这可能会有所帮助。 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM