Spring Cloud Config重复加载配置且首次未携带指定profile问题
问题根因
Spring Cloud 2020.0及之后版本(包含你使用的2021.0.3)默认废弃旧版Bootstrap上下文配置加载逻辑,改用Spring Boot原生Config Data API(对应日志中的ConfigServerConfigDataLoader)拉取配置中心配置。
当前配置同时引入了spring-cloud-starter-bootstrap依赖,又配置了spring.config.import参数,导致新旧两套配置拉取机制同时生效:
- 旧机制(
ConfigServicePropertySourceLocator)由Bootstrap上下文触发,执行时机极早,此时上下文还未完成spring.profiles.active参数解析,因此默认拉取default环境配置,且该配置优先级更高,会覆盖后续正确加载的配置 - 新机制(
ConfigServerConfigDataLoader)由Spring Boot Config Data逻辑触发,执行时机晚于Bootstrap上下文初始化,可以正常读取active profile,拉取到正确的dev环境配置
注意spring.config.import是仅对新Config Data机制生效的配置项,写在bootstrap.yml中不会被Bootstrap上下文识别,反而会被主上下文读取,触发多余的第二次拉取。
解决方案
二选一即可,禁止两套机制同时启用。
方案1:使用官方推荐的新Config Data机制(推荐)
完全移除旧版Bootstrap相关配置,所有配置遵循Spring Boot原生规范:
- 从
pom.xml中删除spring-cloud-starter-bootstrap依赖 - 删除
bootstrap.yml配置文件,将原有配置迁移到application.yml中,示例如下:
spring: application: name: myapp profiles: active: dev config: import: optional:configserver:http://ip:8888 cloud: config: username: admin password: secret
该配置下启动时只会触发一次配置拉取,可正确识别dev profile,不会出现重复拉取、配置优先级错乱问题。
方案2:保留旧版Bootstrap上下文机制
如果项目依赖的其他组件必须使用Bootstrap上下文,可完全禁用新Config Data机制的配置中心拉取逻辑,按旧版规范配置:
- 保留
spring-cloud-starter-bootstrap依赖 - 修改
bootstrap.yml,删除spring.config.import配置项,同时显式指定配置中心地址和拉取使用的profile,避免Bootstrap早期加载阶段读不到active参数,示例如下:
spring: application: name: myapp profiles: active: dev cloud: config: enabled: true uri: http://ip:8888 profile: dev # 显式指定拉取配置的profile,不依赖上下文自动解析active参数 username: admin password: secret
删除spring.config.import配置后,新机制不会自动触发配置拉取,仅保留Bootstrap上下文的单次拉取逻辑,配置spring.cloud.config.profile后可直接拉取对应环境的配置。
内容的提问来源于stack exchange,提问作者patryks
相关产品推荐
相关产品推荐

