Java Spring云配置环境变量的服务器优先级

Java Spring云配置环境变量的服务器优先级,java,spring,spring-boot,spring-cloud,spring-cloud-config,Java,Spring,Spring Boot,Spring Cloud,Spring Cloud Config,我有一个关于使用时环境变量优先级的问题 在我的服务中,我有一个包含此内容的本地属性文件application.yml foo: bar: "some" buz: "some" joe: "some" 该服务还通过包含文件testservice api.yml(其中testservice api是服务的spring应用程序名称)的配置存储库连接到配置服务器。此文件的内容是: foo: bar: "some-specific" 因此,使用此设置,运行时的配置将导致: {

我有一个关于使用时环境变量优先级的问题

在我的服务中,我有一个包含此内容的本地属性文件
application.yml

foo:
  bar: "some"
  buz: "some"
  joe: "some"
该服务还通过包含文件
testservice api.yml
(其中
testservice api
是服务的spring应用程序名称)的配置存储库连接到配置服务器。此文件的内容是:

foo:
  bar: "some-specific"
因此,使用此设置,运行时的配置将导致:

{
    "foo.bar": "some-specific",
    "foo.buz": "some",
    "foo.joe": "some"
}
现在我尝试用环境变量覆盖
foo.bar
foo.joe

因此,我使用以下命令启动服务:

FOO\u BAR=some env FOO\u JOE=some env gradle bootRun

从我在环境变量中读到的内容来看,这些变量应该优先于配置文件,而且spring cloud config文档也没有说明什么不同,因此我希望结果是:

{
    "foo.bar": "some-env",
    "foo.buz": "some",
    "foo.joe": "some-env"
}
但我得到的却是:

{
    "foo.bar": "some-specific",
    "foo.buz": "some",
    "foo.joe": "some-env"
}
因此,只有jar中本地配置文件中的配置才被环境变量覆盖——config repo中的属性似乎优先于环境变量

这是可以解释的,还是一个bug?这个有什么提示吗

请在此处找到示例代码:


存储库中的自述文件列出了此处描述的问题,即在git repo中定义以下属性(作为配置服务器的源)[对于给定的配置文件]:

spring.cloud.config:
重写系统属性:false
覆盖一个:对


请记住,bootsrap.yml中的属性(尤其是overridesystemproperty和overrideOne)默认情况下会被配置服务器中的属性覆盖

配置服务器具有最高优先级。@Spencergib感谢您的提示-它记录在某处了吗?我所发现的只是“这些规则与在独立的Spring启动应用程序中应用的规则相同。”-所以我认为这些规则适用-如果不适用,应该适用,但应该在Spring云文档中。@Spencergib我尝试了这个。所有关于优先级的语句都会被读取,就好像正常的spring引导行为适用一样。这似乎包括了一节关于覆盖配置服务器属性的内容。仅供参考,对于我来说,当我将其放入单个应用程序(配置客户端)的git repo配置文件中时,它起到了作用当我把它放在配置服务器的git repo配置文件中时,它不起作用经过一番思考,我意识到可以这样做很酷,但是,这可能不是一个好主意。引入一个集中式配置组件的全部目的就是为了获得这个集中式配置。如果您开始允许它成为分布式配置,那么有101种方式会出错。考虑如果需要更改通过EnV VAR提供的API密钥,将会发生什么。您需要重新启动服务。那么配置服务器有什么意义呢?小心使用!必须通过重写配置服务器来注入一些变量。例如,假设您有一个Kubernetes部署,它指向一个具有动态名称的服务(每次部署Helm图表时都会更改)。configserver永远不会知道正确的名称,而且每次动态名称更改时都必须手动更改配置,这将非常糟糕。尽管可以使用Jenkins管道来更改存储库的代码并提交,但这太复杂了。