You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

升级Spring Boot与Spring Cloud后,因Fabric8ConfigReloadAutoConfiguration存在Bean歧义导致应用启动失败的排查问询

升级Spring Boot与Spring Cloud后,因Fabric8ConfigReloadAutoConfiguration存在Bean歧义导致应用启动失败的排查问询

大家好,我最近在升级Spring Boot和Spring Cloud版本后遇到了应用启动失败的问题,想请各位帮忙分析排查一下:

背景情况

  • 原环境:基于Spring Boot 2.7.14 + Spring Cloud 2021.0.8开发的微服务,部署在K8s 1.25集群上,启动完全正常
  • 升级后:将版本切换为Spring Boot 3.1.5 + Spring Cloud 2022.0.3,应用启动直接失败

错误现象

启动时抛出Bean歧义错误,具体日志如下:

{
  "timestamp": "2023-12-20T10:43:37.844Z",
  "severity": "error",
  "message": "***************************APPLICATION FAILED TO START***************************Description:\n\nParameter 2 of method configMapPropertyChangeEventWatcher in org.springframework.cloud.kubernetes.fabric8.config.reload.Fabric8ConfigReloadAutoConfiguration required a single bean, but 2 were found:\n\t- configDataConfigMapPropertySourceLocator: a programmatically registered singleton\t- configMapPropertySourceLocator: defined by method 'configMapPropertySourceLocator' in class path resource [org/springframework/cloud/kubernetes/fabric8/config/Fabric8BootstrapConfiguration.class]\n\n\nAction:\n\nConsider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed\n ",
  "service_id": "databasefe",
  "metadata": {
    "function": "DBFE"
  },
  "version": "1.2.0"
}

我已做的变更

升级过程中,除了版本号调整,只做了以下两处修改,都是遵循Spring Cloud Kubernetes文档中「5. Kubernetes PropertySource implementations」章节的指引:

  1. 依赖调整:移除了spring-cloud-starter-bootstrap依赖
  2. 配置文件替换
    • bootstrap.properties内容:
      # Bootstrap settings for ConfigMap
      spring.application.name=${SERVICE_NAME:my-app}
      
    • 替换为新的application.properties
      spring.config.import=optional:kubernetes:
      spring.cloud.kubernetes.config.name=${SERVICE_NAME:my-app}
      

我的疑问

现在的问题是,Fabric8ConfigReloadAutoConfiguration需要一个Fabric8ConfigMapPropertySourceLocator类型的Bean,但容器里却出现了两个:configDataConfigMapPropertySourceLocator(编程式注册的单例)和configMapPropertySourceLocator(来自Fabric8BootstrapConfiguration的方法定义)。这两个Bean都是Spring Cloud Kubernetes Fabric8包自带的,我没办法直接修改它们来标记@Primary或者@Qualifier

想请教各位:

  • 升级后到底是什么变化导致了这个Bean歧义问题?
  • 我应该从哪些方向入手排查和解决这个问题?

相关POM核心依赖片段

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <artifactId>java-dependencies-layer</artifactId>
  <packaging>jar</packaging>
  <parent>
    <groupId>com.company.product</groupId>
    <artifactId>java-dependencies-aggregator</artifactId>
    <version>${revision}</version>
  </parent>
  <properties>
    <java.version>17</java.version>
    <revision>1.0.0-dummy</revision>
  </properties>
  <dependencies>
    <!-- Spring Framework dependencies start -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-to-slf4j</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-stream</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-stream-binder-kafka</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-kubernetes-fabric8-config</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <!-- 其他Spring相关依赖省略 -->
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>Application</mainClass>
          <layers>
            <enabled>true</enabled>
            <includeLayerTools>true</includeLayerTools>
          </layers>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

备注:内容来源于stack exchange,提问作者Alberto San José

火山引擎 最新活动