升级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」章节的指引:
- 依赖调整:移除了
spring-cloud-starter-bootstrap依赖 - 配置文件替换:
- 原
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é




