关于Spring Cloud 本地属性覆盖的问题

 更新时间:2022年03月01日 15:29:29   作者:架构核心技术  
这篇文章主要介绍了关于Spring Cloud 本地属性覆盖的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Spring Cloud 本地属性覆盖

注:使用版本版本 spring cloud F SR2

当前在项目中使用了Spring cloud 配置中心模式,使用spring.cloud.config.server.overrides对一些公共配置进行下发,比如kafka bus 的server 配置等等,但是在一些特殊情况下需要本地使用其他的kafka配置,所以就有了配置上的冲突。但是远程配置的优先级默认高于本地配置。

优先级如下

  • 1.命令行参数
  • 2.java:comp/env 里的 JNDI 属性
  • 3.JVM 系统属性
  • 4.操作系统环境变量
  • 5.RandomValuePropertySource 属性类生成的 random.* 属性
  • 6.应用以外的 application.properties(或 yml)文件
  • 7.打包在应用内的 application.properties(或 yml)文件
  • 8.在应用 @Configuration 配置类中,用 @PropertySource 注解声明的属性文件
  • 9.SpringApplication.setDefaultProperties 声明的默认属性

所以 本地kafka配置不能生效了。

官方给出了解决方案如下

2.4 Overriding the Values of Remote Properties
The property sources that are added to your application by the bootstrap context are often “remote” (from example, from Spring Cloud Config Server). By default, they cannot be overridden locally. If you want to let your applications override the remote properties with their own System properties or config files, the remote property source has to grant it permission by setting spring.cloud.config.allowOverride=true (it does not work to set this locally). Once that flag is set, two finer-grained settings control the location of the remote properties in relation to system properties and the application’s local configuration:
spring.cloud.config.overrideNone=true: Override from any local property source.
spring.cloud.config.overrideSystemProperties=false: Only system properties, command line arguments, and environment variables (but not the local config files) should override the remote settings.

也就是说

如果想要远程配置优先级高,那么allowOverride设置为false,如果想要本地配置优先级高那么allowOverride设置为true

spring.cloud.config.allowOverride=true

overrideNone为true时本地配置优先级高,包括系统环境变量、本地配置文件等等

spring.cloud.config.overrideNone=true

只有系统环境变量或者系统属性才能覆盖远程配置文件的配置,本地配置文件中配置优先级低于远程配置

spring.cloud.config.overrideSystemProperties=false

看起来很美好,配置下就可以了,但真正配置的时候要注意配置的位置,否则配置加载就会变的很混乱了。

一般配置有三个地方

  • 本地配置
  • 远程 properties
  • config server 下发配置

因为本地优先级低于远程配置,所以建议配置spring.cloud.config.overrideNone=true 在远程git properties中即可。

但是这样配置也会有一点点小坑,因为会默认本地有的配置就会优先采用,比如kafka的本地默认配置

"kafkaBinderDefaultProperties": {
       "spring.kafka.consumer.valueDeserializer": "org.apache.kafka.common.serialization.ByteArrayDeserializer",
       "spring.kafka.producer.keySerializer": "org.apache.kafka.common.serialization.ByteArraySerializer",
       "spring.kafka.consumer.keyDeserializer": "org.apache.kafka.common.serialization.ByteArrayDeserializer",
       "logging.level.kafka.server.KafkaConfig": "ERROR",
       "logging.level.org.I0Itec.zkclient": "ERROR",
       "spring.kafka.producer.valueSerializer": "org.apache.kafka.common.serialization.ByteArraySerializer",
       "logging.level.kafka.admin.AdminClient.AdminConfig": "ERROR"
   }

如果我们想配置kafka序列化的模式比如在远程配置成key string 那就不会生效了,所以在使用的时候要注意类型即可。

总结下:所以,如果想在项目中覆盖远程配置,在远程配置中添加spring.cloud.config.overrideNone=true 即可,千万不要加在本地bootstrap.properties那样会无效的。

Spring Cloud Config本地配置覆盖远程配置

Spring Cloud Config 配置的优先级

远程配置 > 本地配置 > java代码配置

当需要本地配置优先时,可以限制远程配置的优先级

配置

spring:
  cloud:
    config:
      allow-override: true
      override-none: true
      override-system-properties: false

参数解释

  • allow-override:决定override-system-properties是否启用,默认为true,false=禁用用户的配置
  • override-system-properties:用来标识外部配置是否能够覆盖系统属性,默认为true;
  • override-none:当allow-override和override-none同时为true,远程配置的优先级降低,不能覆盖其他配置;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Java创建数据透视表并导出为PDF的方法

    使用Java创建数据透视表并导出为PDF的方法

    数据透视分析是一种强大的工具,可以帮助我们从大量数据中提取有用信息并进行深入分析,本文将介绍如何使用Java来构建PivotTable以及实现数据透视分析,并将其导出为PDF
    2023-10-10
  • SpringBoot2.0实现多图片上传加回显

    SpringBoot2.0实现多图片上传加回显

    这两天公司有需求让做一个商户注册的后台功能,其中需要商户上传多张图片并回显,本文就使用SpringBoot2.0实现,具有一定的参考价值,感兴趣的可以了解一下
    2021-07-07
  • Java中Comparator升序降序的具体使用

    Java中Comparator升序降序的具体使用

    本文主要介绍了Java中Comparator升序降序的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java生成jar包并且单进程运行的实例

    java生成jar包并且单进程运行的实例

    下面小编就为大家分享一篇java生成jar包并且单进程运行的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • JVM运行时数据区划分原理详解

    JVM运行时数据区划分原理详解

    这篇文章主要介绍了JVM运行时数据区划分原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java String.replace()方法

    Java String.replace()方法"无效"的原因及解决方式

    这篇文章主要介绍了Java String.replace()方法"无效"的原因及解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • SpringBoot单元测试使用@Test没有run方法的解决方案

    SpringBoot单元测试使用@Test没有run方法的解决方案

    这篇文章主要介绍了SpringBoot单元测试使用@Test没有run方法的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java虚拟机JVM性能优化(二):编译器

    Java虚拟机JVM性能优化(二):编译器

    这篇文章主要介绍了Java虚拟机JVM性能优化(二):编译器,本文先是讲解了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比,然后给出了几种常见的JVM优化方法,需要的朋友可以参考下
    2014-09-09
  • SpringBoot中使用spring-retry 解决失败重试调用

    SpringBoot中使用spring-retry 解决失败重试调用

    本文主要介绍了SpringBoot中使用spring-retry 解决失败重试调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Spring源码解析之编程式事务

    Spring源码解析之编程式事务

    今天给大家带来的是关于Java Spring的相关知识,文章围绕着Spring编程式事务展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06

最新评论