关于Spring Cloud 本地属性覆盖的问题
作者:架构核心技术 发布时间:2021-09-17 09:26:42
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,远程配置的优先级降低,不能覆盖其他配置;
来源:https://blog.csdn.net/luqiang81191293/article/details/83624558


猜你喜欢
- 今天导入了一个模型,但是模型贴图丢失了,而且Inspector面板中处于不能编辑的状态虽然可以通过重新创建材质来替换,但是这样会生成一个新的
- 由于经常用到文件处理,便自己封装了下 分享给大家。 包含写入文本 批量删除文件 下载文件 。--可直接使用/// <summary&g
- Eclipse查看开发包jar里源代码的方法前言:最近我打算学习一下谷歌的类库Guava,下载了Guava-r09.jar包及其源码,为了可
- idea2019导入maven项目中的某些问题idea2019导入maven项目,会出现很多莫名其妙的问题,需要注意的是如果是idea201
- 接上一篇写的截取电脑屏幕,我们在原来的基础上加一个选择区域的功能,实现自定义选择截图。个人比较懒,上一篇的代码就不重新设计了,就简单改一下呈
- 序目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段。C# 6.0 虽说
- 1 前言单例模式是我们经常使用的一种模式,一般来说很多资料都建议我们写成如下的模式:/** * Created by qiyei2015 o
- 本文介绍Android实现首字母导航条,先看张效果图,具体怎么实现看代码吧具体的步骤1.整体布局的显示 2. 实现A-Z的分组 3. 自定义
- // 十进制转化为十六进制,结果为C8。 Integer.toHexString(200); //十六进制转化为十进制,
- 一、LockSupport类的属性private static final sun.misc.Unsafe UNSAFE; &
- 通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员
- 数据类型转换就是将数据(变量、表达式的结果)从一种类型转换到另一种类型。例如,为了保存小数你可以将int类型的变量转换为double类型。数
- 本文实例讲述了Android手机获取root权限并实现关机重启功能的方法,是Android程序设计中非常常见的重要功能。现分享给大家,供大家
- java字符串如何进行比较?我们可以根据内容和引用来比较Java中的String。它用于身份验证(通过 equals() 方法)、排序(通过
- 本文实例讲述了Android编程应用风格和主题。分享给大家供大家参考,具体如下:当你设计你的程序的时候,你可以用风格和主题来统一格式化各种屏
- 会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来;
- 本文实例讲述了android编程之ip2id程序。分享给大家供大家参考。具体分析如下:一、说明:公司一个项目中需要给一系列网络设备分配id号
- 前言很多人觉得Xamarin的开源少,没法用来开发项目。但,实际上Xamarin已经有很多开源代码了;只要不是特别特殊的项目,基本上是都可以
- 本文实例为大家分享了Java多线程实现复制文件的具体代码,供大家参考,具体内容如下/** * 实现文件复制功能 * 多线
- 经过一段时间的学习和项目实践,你会发现,打包->上传蒲公英->生成二维码是一个枯燥且乏味的事情,只要打包配置项,配置完成,剩下的