Spring Cloud 本地屬性覆蓋問題

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

當(dāng)前在項目中使用了Spring cloud 配置中心模式,使用spring.cloud.config.server.overrides對一些公共配置進行下發(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ōu)先級低于遠(yuǎn)程配置,所以建議配置spring.cloud.config.overrideNone=true 在遠(yuǎn)程git properties中即可。

但是這樣配置也會有一點點小坑,因為會默認(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é)下:

所以,如果想在項目中覆蓋遠(yuǎn)程配置,在遠(yuǎn)程配置中添加spring.cloud.config.overrideNone=true 即可,千萬不要加在本地bootstrap.properties那樣會無效的。
角旮旯兒
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容