關(guān)于Spring Cloud 本地屬性覆蓋的問題
Spring Cloud 本地屬性覆蓋
注:使用版本版本 spring cloud F SR2
當(dāng)前在項(xiàng)目中使用了Spring cloud 配置中心模式,使用spring.cloud.config.server.overrides對一些公共配置進(jìn)行下發(fā),比如kafka bus 的server 配置等等,但是在一些特殊情況下需要本地使用其他的kafka配置,所以就有了配置上的沖突。但是遠(yuǎn)程配置的優(yōu)先級默認(rèn)高于本地配置。
優(yōu)先級如下
- 1.命令行參數(shù)
- 2.java:comp/env 里的 JNDI 屬性
- 3.JVM 系統(tǒng)屬性
- 4.操作系統(tǒng)環(huán)境變量
- 5.RandomValuePropertySource 屬性類生成的 random.* 屬性
- 6.應(yīng)用以外的 application.properties(或 yml)文件
- 7.打包在應(yīng)用內(nèi)的 application.properties(或 yml)文件
- 8.在應(yīng)用 @Configuration 配置類中,用 @PropertySource 注解聲明的屬性文件
- 9.SpringApplication.setDefaultProperties 聲明的默認(rèn)屬性
所以 本地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.
也就是說
如果想要遠(yuǎn)程配置優(yōu)先級高,那么allowOverride設(shè)置為false,如果想要本地配置優(yōu)先級高那么allowOverride設(shè)置為true
spring.cloud.config.allowOverride=true
overrideNone為true時本地配置優(yōu)先級高,包括系統(tǒng)環(huán)境變量、本地配置文件等等
spring.cloud.config.overrideNone=true
只有系統(tǒng)環(huán)境變量或者系統(tǒng)屬性才能覆蓋遠(yuǎn)程配置文件的配置,本地配置文件中配置優(yōu)先級低于遠(yuǎn)程配置
spring.cloud.config.overrideSystemProperties=false
看起來很美好,配置下就可以了,但真正配置的時候要注意配置的位置,否則配置加載就會變的很混亂了。
一般配置有三個地方
- 本地配置
- 遠(yuǎn)程 properties
- config server 下發(fā)配置
因?yàn)楸镜貎?yōu)先級低于遠(yuǎn)程配置,所以建議配置spring.cloud.config.overrideNone=true 在遠(yuǎn)程git properties中即可。
但是這樣配置也會有一點(diǎn)點(diǎn)小坑,因?yàn)闀J(rèn)本地有的配置就會優(yōu)先采用,比如kafka的本地默認(rèn)配置
"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序列化的模式比如在遠(yuǎn)程配置成key string 那就不會生效了,所以在使用的時候要注意類型即可。
總結(jié)下:所以,如果想在項(xiàng)目中覆蓋遠(yuǎn)程配置,在遠(yuǎn)程配置中添加spring.cloud.config.overrideNone=true 即可,千萬不要加在本地bootstrap.properties那樣會無效的。
Spring Cloud Config本地配置覆蓋遠(yuǎn)程配置
Spring Cloud Config 配置的優(yōu)先級
遠(yuǎn)程配置 > 本地配置 > java代碼配置
當(dāng)需要本地配置優(yōu)先時,可以限制遠(yuǎn)程配置的優(yōu)先級
配置
spring: ? cloud: ? ? config: ? ? ? allow-override: true ? ? ? override-none: true ? ? ? override-system-properties: false
參數(shù)解釋
allow-override
:決定override-system-properties是否啟用,默認(rèn)為true,false=禁用用戶的配置override-system-properties
:用來標(biāo)識外部配置是否能夠覆蓋系統(tǒng)屬性,默認(rèn)為true;override-none
:當(dāng)allow-override和override-none同時為true,遠(yuǎn)程配置的優(yōu)先級降低,不能覆蓋其他配置;
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于maven全局配置文件settings.xml解析
這篇文章主要介紹了關(guān)于maven全局配置文件settings.xml,具有很好的參考價值,希望對大家有所幫助。2022-03-03Spring Cloud Gateway(讀取、修改 Request Body)的操作
這篇文章主要介紹了Spring Cloud Gateway(讀取、修改 Request Body)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12java實(shí)現(xiàn)周期性執(zhí)行(定時任務(wù))
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)周期性執(zhí)行定時任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09java按照模板導(dǎo)出pdf或word文件詳細(xì)代碼
有時候業(yè)務(wù)中我們需要使用pdf模板生成一份pdf文件,下面這篇文章主要給大家介紹了關(guān)于java按照模板導(dǎo)出pdf或word文件的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-11-11