spring cloud 本地配置优先

如果我们的项目使用了远程配置中心,就会使用远程配置优先。可在实际开发中,通常我们需要本地的部分配置优先于远程配置,方便开发调试。

spring cloud为我们提供了相关的配置:

使用propertise配置

1.不适用远程配置,默认值是true,不要调整成false, 可以不配置,使用默认即可

# 如果想要远程配置优先级高,那么 allow-override 设置为 false,如果想要本地配置优先级高那么 allow-override 设置为 true
spring.cloud.config.allow-override=true

2.本地文件优先,

# 如果本地配置优先级高,那么 override-none 设置为 true,包括系统环境变量、本地配置文件等配置
spring.cloud.config.override-none=true

3.远程配置只覆盖本地配置文件

# 只有系统环境变量或者系统属性才能覆盖远程配置文件的配置,本地配置文件中配置优先级低于远程配置;注意本地配置文件不是系统属性      
spring.cloud.config.override-system-properties=false

2或3任意配置即可,只会生效一种。

使用yml配置同properties一样:

spring:
  cloud:
    config:
      # 如果本地配置优先级高,那么 override-none 设置为 true,包括系统环境变量、本地配置文件等配置
      override-none: true
      # 如果想要远程配置优先级高,那么 allow-override 设置为 false,如果想要本地配置优先级高那么 allow-override 设置为 true
      allow-override: true
      # 只有系统环境变量或者系统属性才能覆盖远程配置文件的配置,本地配置文件中配置优先级低于远程配置;注意本地配置文件不是系统属性
      override-system-properties: false

配置到这里,可能就会去尝试。不过当你配置完成后会发觉,好像配置没有生效。不要着急,我们继续分析。

上源码:

org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration#insertPropertySources

我们反向看一下:

  1. 通过remoteProperties对象的属性判断的
  2. remoteProperties的属性是通过spring.cloud.config的键值对复制的
  3. 键值对是通过环境变量中incoming获取的
  4. incoming是new出来的也就是说没有值
  5. incoming的值是通过reversedComposite的的值排序后添每次加头部进去的,也就是和reversedComposite原始的顺序是一致的,propertySources中已有值,需要使用addFirst把远程配置加载到前列,就需要先倒序.
  6. 查看composite就知道了,最终的参数是从哪里获取的。

从结果发现,composite中的配置全部是来自与远程配置。

所以如果你需要本地配置优先,需要把上面的配置放在远程配置中的配置文件中才可以生效

同时需要注意文件顺序

  1. { application.name}-{ profiles}.后缀
  2. { application.name}.后缀
  3. { application.name}
  4. spring.cloud.nacos.config.shared-configs中的公共配置

快去试一下效果吧!!~~~~~~~~~~~~~~~~~~~~

经验分享 程序员 微信小程序 职场和发展