Spring 配置文件在从 Spring 云配置服务器获取配置时排序不正确
Spring profiles not ordering correctly when obtaining config from Spring Cloud Config Server
我有一个 Spring 引导应用程序从 Spring 云配置服务器(本机模式)获取配置。配置服务器加载的配置位置中的基础 application.yml 文件包含以下内容:
eureka:
client:
service-url:
defaultZone: ${BOOT_EUREKA_LOCATIONS:http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka}
register-with-eureka: true
---
spring:
profiles: test
eureka:
client:
register-with-eureka: false #no registration on Eureka when testing
service-url:
defaultZone: ${BOOT_EUREKA_LOCATIONS:http://sparky:8761/eureka}
当访问配置服务器 (http://mygateway/config-server/myapp/test) 的端点时,我在配置文件 "test" 中返回 "myapp" 应用程序 运行 的以下内容:
{
"name": "myapp",
"profiles": [
"test"
],
"label": null,
"version": null,
"state": null,
"propertySources": [
{
"name": "file:////wherever/application.yml#test",
"source": {
"spring.profiles": "test",
"eureka.client.register-with-eureka": false,
"eureka.client.service-url.defaultZone": "${BOOT_EUREKA_LOCATIONS:http://sparky:8761/eureka}"
}
},
{
"name": "file:////whereever/application.yml",
"source": {
"eureka.client.service-url.defaultZone": "${BOOT_EUREKA_LOCATIONS:http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka}"
在test profile中运行myApp时,eureka.client.service-url.defaultZone的值为http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka,这是意想不到的。
我原以为测试配置文件中的条目会覆盖它(就像您在本地拥有 application.yml 时一样)。思考为什么在 myApp 中使用值时我不会从 "test" 配置文件中获取值?
我的意图是在顶部添加 "default" 值,并让 "profile" 覆盖任何非标准默认值。
更新:
myApp/env 不显示加载的 "application.yml#test",但它显示测试配置文件,但仅显示从配置服务器返回的默认值(不是 #test 的):
{
"profiles": [
"test"
],
"server.ports": {
"local.server.port": 7761
},
"configService:file:////wherever/application.yml": {
"eureka.client.service-url.defaultZone": "http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka"
完全是用户错误。我在 application.yml 中设置了默认的 "test" 活动配置文件,而不是作为环境变量或 bootstrap.yml 传入,因此它没有足够快地加载到配置服务器命中。
我有一个 Spring 引导应用程序从 Spring 云配置服务器(本机模式)获取配置。配置服务器加载的配置位置中的基础 application.yml 文件包含以下内容:
eureka:
client:
service-url:
defaultZone: ${BOOT_EUREKA_LOCATIONS:http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka}
register-with-eureka: true
---
spring:
profiles: test
eureka:
client:
register-with-eureka: false #no registration on Eureka when testing
service-url:
defaultZone: ${BOOT_EUREKA_LOCATIONS:http://sparky:8761/eureka}
当访问配置服务器 (http://mygateway/config-server/myapp/test) 的端点时,我在配置文件 "test" 中返回 "myapp" 应用程序 运行 的以下内容:
{
"name": "myapp",
"profiles": [
"test"
],
"label": null,
"version": null,
"state": null,
"propertySources": [
{
"name": "file:////wherever/application.yml#test",
"source": {
"spring.profiles": "test",
"eureka.client.register-with-eureka": false,
"eureka.client.service-url.defaultZone": "${BOOT_EUREKA_LOCATIONS:http://sparky:8761/eureka}"
}
},
{
"name": "file:////whereever/application.yml",
"source": {
"eureka.client.service-url.defaultZone": "${BOOT_EUREKA_LOCATIONS:http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka}"
在test profile中运行myApp时,eureka.client.service-url.defaultZone的值为http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka,这是意想不到的。
我原以为测试配置文件中的条目会覆盖它(就像您在本地拥有 application.yml 时一样)。思考为什么在 myApp 中使用值时我不会从 "test" 配置文件中获取值?
我的意图是在顶部添加 "default" 值,并让 "profile" 覆盖任何非标准默认值。
更新: myApp/env 不显示加载的 "application.yml#test",但它显示测试配置文件,但仅显示从配置服务器返回的默认值(不是 #test 的):
{
"profiles": [
"test"
],
"server.ports": {
"local.server.port": 7761
},
"configService:file:////wherever/application.yml": {
"eureka.client.service-url.defaultZone": "http://instance1.localhost:7761/eureka,http://instance2.localhost:7762/eureka,http://instance3.localhost:7763/eureka"
完全是用户错误。我在 application.yml 中设置了默认的 "test" 活动配置文件,而不是作为环境变量或 bootstrap.yml 传入,因此它没有足够快地加载到配置服务器命中。