在使用Spring Cloud配合Nacos Config作爲配置中心來使用的時候,Nacos支持對多個環境的配置管理,通常通過命名空間來實現,比如測試環境,預發佈環境。而如果使用同一個配置中心有多個項目組或者團隊或者不同的模塊管理的時候,通常使用Group來區分,Nacos Config相關的配置詳情,在官方文檔中都有過介紹,通過閱讀可以瞭解,https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Nacos-config,這裏向大家分享一下,使用中遇到的一個問題,或者說是一點文檔中描述不太明確的地方,Nacos Config, 支持自定義 Group 的配置以及支持自定義擴展的 Data Id 配置 ,其中Group默認使用的是DEFAULT_GROUP, 我們可以從nacos的源碼 org.springframework.cloud.alibaba.nacos.NacosConfigProperties中看到,如果想支持對多個配置文件的使用,需要用到ext-config,spring.cloud.nacos.config.ext-config[n].data-id, spring.cloud.nacos.config.ext-config[n].group, spring.cloud.nacos.config.ext-config[n].refresh, 但是在使用的時候遇到了一個問題 ,就是在ext-config 裏配置了和應用名相同的配置文件時,則實際去獲取的不是ext-config的group而是使用的DEFAULT_GROUP來獲取的,如果你在DEFAULT_GROUP沒有配置文件,則什麼都獲取不到,相當於DEFAULT_GROUP覆蓋掉了自定義配置中配置的Group,例如:當前服務的名稱爲 nacos-demo 既 spring.application.name=nacos-demo
spring.cloud.nacos.config.ext-config[0].data-id=nacos-demo.properties( ${spring.application.name}.properties )
spring.cloud.nacos.config.ext-config[0].group=DEMO
spring.cloud.nacos.config.ext-config[0].refresh=true
那麼Client在獲取配置的時候,默認是獲取的 data-id爲nacos-demo.properties group爲DEFAULT_GROUP的配置文件,而取不到DEMO的配置,這是爲什麼呢? 從nacos的源碼 NacosPropertySourceLocator 中可以看到
他的加載順序是默認加載 SharedConfig共享配置,然後加載extConfig自定義配置,最後加載applicationConfig, 因此最後加載的會覆蓋掉之前的配置,因此當你讀取應用名同名的配置時會讀取不到,因爲配置中心裏並沒有配置 Group爲 DEFAULT_GROUP的nacos-demo.properties。 spring.cloud.nacos.config.group的優先級會高於spring.cloud.nacos.config.ext-config[0].group的優先級
因此配置的時候要留意,如果是和應用名同名的配置文件,不要配置在 config.ext-config 中,直接配置在spring.cloud.nacos.config.group=DEMO,ext-config中配置應用名以外的配置文件,Group也可以配置爲其他自定義組
spring.cloud.nacos.config.ext-config[0].data-id=(非應用名).properties
spring.cloud.nacos.config.ext-config[0].group=default
spring.cloud.nacos.config.ext-config[0].refresh=true,這樣就不會出現獲取不到配置文件的事情了。
配置的優先級
Spring Cloud Alibaba Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關的配置。
-
A: 通過
spring.cloud.nacos.config.shared-dataids
支持多個共享 Data Id 的配置 -
B: 通過
spring.cloud.nacos.config.ext-config[n].data-id
的方式支持多個擴展 Data Id 的配置 -
C: 通過內部相關規則(應用名、應用名+ Profile )自動生成相關的 Data Id 配置
當三種方式共同使用時,他們的一個優先級關係是:A < B < C