Spring boot 2.4.x 无法处理来自配置服务器的多文档 yml 文件
Spring boot 2.4.x cannot handle multi document yml files from config server
- Java版本:8
- Spring开机版本:2.4.1
- Spring Cloud 版本:2020.0.0,具体来说,我使用连接到 GIT 的 Spring Cloud Config Server,我们的服务是 Spring Cloud Config Clients。
我已经不再使用 bootstrap.yml
并开始使用 spring.config.import
和 spring.config.activate.on-profile
,如文档 here and here
中所述
我的服务配置(配置服务器的客户端)如下所示:
server.port: 9001
spring:
application.name: my-rest-service
config.import: configserver:http://localhost:8888
cloud.config.profile: ${spring.profiles.active}
我在配置服务器中的配置如下所示:
application.yml(有两个文件由 --- 分隔)
logging:
file.name: <omitted>
level:
root: INFO
---
spring:
config.activate.on-profile: dev
logging.level.root: DEBUG
my-rest-sercive.yml(有两个文件由 --- 分隔)
spring:
datasource:
driver-class-name: <omitted>
username: <omitted>
password: <omitted>
---
spring:
config.activate.on-profile: dev
datasource.url: <omitted>
因为有一个配置文件“dev”处于活动状态,所以我从配置服务器成功获取了以下 4 个配置:
application.yml
: 一般日志级别
application.yml
:dev 的特定日志记录
my-rest-sercive.yml
: 通用数据源属性
my-rest-sercive.yml
: dev 的特定数据源 url
当我使用浏览器或调试时,或者当我降低日志级别进行跟踪时,我可以在日志中看到这 4 个源被成功获取:
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\my-rest-service.yml'
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\my-rest-service.yml'
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\application.yml'
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\application.yml'
但是,请注意,因为我使用多文档 yml 文件,所以在这 4 个 属性 源中,只使用了两个唯一名称。
在后面的步骤中,当 Spring 创建数据源 bean 时,他抱怨找不到数据源 URL。如果我调试 spring bean 工厂,我确实可以看到在配置服务器返回的 4 个 属性 文件中,只剩下两个(不包含开发配置文件特定配置的文件) .我认为这是因为它们具有相同的名称并且它们相互覆盖。这是MutablePropertySource.class
:
中这段代码的效果
public void addLast(PropertySource<?> propertySource) {
synchronized(this.propertySourceList) {
this.removeIfPresent(propertySource); <-- this is the culrprit!
this.propertySourceList.add(propertySource);
}
}
这是 Spring 2.3/Spring Cloud Hoxton 的重大更改,它正确地收集了所有属性。我认为 spring 云需要更改配置服务器,以便 yml 中的每个文档在返回到 Spring 时都有一个唯一的名称。这正是 Spring Boot 处理多文档 yml 文件的方式,通过将字符串 (documenyt #1)
附加到 属性 源名称
我发现 an interesting note 关于配置文件和多文档 yml,基本上说它不受支持,但这不适用于我的用例,因为我的 yml 文件不是基于配置文件的(没有 -{profileName}
在文件名的最后部分)。
这是新版本的一个已知问题。我们可以在 the spring cloud config server github page.
上跟踪此问题
解决方法似乎是停止使用多文档 yml 文件并使用文件名中包含配置文件名称的多个不同文件。
- Java版本:8
- Spring开机版本:2.4.1
- Spring Cloud 版本:2020.0.0,具体来说,我使用连接到 GIT 的 Spring Cloud Config Server,我们的服务是 Spring Cloud Config Clients。
我已经不再使用 bootstrap.yml
并开始使用 spring.config.import
和 spring.config.activate.on-profile
,如文档 here and here
我的服务配置(配置服务器的客户端)如下所示:
server.port: 9001
spring:
application.name: my-rest-service
config.import: configserver:http://localhost:8888
cloud.config.profile: ${spring.profiles.active}
我在配置服务器中的配置如下所示:
application.yml(有两个文件由 --- 分隔)
logging:
file.name: <omitted>
level:
root: INFO
---
spring:
config.activate.on-profile: dev
logging.level.root: DEBUG
my-rest-sercive.yml(有两个文件由 --- 分隔)
spring:
datasource:
driver-class-name: <omitted>
username: <omitted>
password: <omitted>
---
spring:
config.activate.on-profile: dev
datasource.url: <omitted>
因为有一个配置文件“dev”处于活动状态,所以我从配置服务器成功获取了以下 4 个配置:
application.yml
: 一般日志级别application.yml
:dev 的特定日志记录
my-rest-sercive.yml
: 通用数据源属性my-rest-sercive.yml
: dev 的特定数据源 url
当我使用浏览器或调试时,或者当我降低日志级别进行跟踪时,我可以在日志中看到这 4 个源被成功获取:
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\my-rest-service.yml'
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\my-rest-service.yml'
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\application.yml'
o.s.b.c.config.ConfigDataEnvironment : Adding imported property source 'configserver:https://git.company.com/path.git/file:C:\configservergit\config\application.yml'
但是,请注意,因为我使用多文档 yml 文件,所以在这 4 个 属性 源中,只使用了两个唯一名称。
在后面的步骤中,当 Spring 创建数据源 bean 时,他抱怨找不到数据源 URL。如果我调试 spring bean 工厂,我确实可以看到在配置服务器返回的 4 个 属性 文件中,只剩下两个(不包含开发配置文件特定配置的文件) .我认为这是因为它们具有相同的名称并且它们相互覆盖。这是MutablePropertySource.class
:
public void addLast(PropertySource<?> propertySource) {
synchronized(this.propertySourceList) {
this.removeIfPresent(propertySource); <-- this is the culrprit!
this.propertySourceList.add(propertySource);
}
}
这是 Spring 2.3/Spring Cloud Hoxton 的重大更改,它正确地收集了所有属性。我认为 spring 云需要更改配置服务器,以便 yml 中的每个文档在返回到 Spring 时都有一个唯一的名称。这正是 Spring Boot 处理多文档 yml 文件的方式,通过将字符串 (documenyt #1)
附加到 属性 源名称
我发现 an interesting note 关于配置文件和多文档 yml,基本上说它不受支持,但这不适用于我的用例,因为我的 yml 文件不是基于配置文件的(没有 -{profileName}
在文件名的最后部分)。
这是新版本的一个已知问题。我们可以在 the spring cloud config server github page.
上跟踪此问题解决方法似乎是停止使用多文档 yml 文件并使用文件名中包含配置文件名称的多个不同文件。