一揉阎、共享配置(shared-configs)和擴(kuò)展配(extension-config)
日常開發(fā)中,多個模塊可能會有很多共用的配置背捌,比如數(shù)據(jù)庫連接信息毙籽,Redis 連接信息,RabbitMQ 連接信息毡庆,監(jiān)控配置等等坑赡。那么此時,我們就希望可以加載多個配置么抗,多個項(xiàng)目共享同一個配置之類等功能毅否,Nacos Config 也確實(shí)支持。
Nacos在配置路徑
spring.cloud.nacos.config.extension-config
下蝇刀,允許我們指定?個或多個額外配置螟加。Nacos在配置路徑
spring.cloud.nacos.config.shared-configs
下,允許我們指定?個或多個共享配置吞琐。
上述兩類配置都?持三個屬性:data-id
捆探、group
(默認(rèn)為字符串DEFAULT_GROUP
)、refresh
(默認(rèn)為true
)站粟。
1.1 版本說明
- Nacos:2.0.0
- spring-cloud.version:Hoxton.SR9
- spring-boot.version:2.3.6.RELEASE
- alibaba.cloud.version:2.2.3.RELEASE
1.2 maven依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
1.3 配置文件將application改成bootstrap
application.yml作用域在于當(dāng)前應(yīng)用有效黍图,bootstrap.yml系統(tǒng)級別的配置有效(一般采用遠(yuǎn)程配置的時候才會用到)。
因此卒蘸,將項(xiàng)目中原來的application.yml雌隅、application-dev.yml對應(yīng)改成bootstrap.yml翻默、bootstrap-dev.yml 。
二恰起、配置實(shí)例
spring:
application:
name: nacos-config-multi
main:
allow-bean-definition-overriding: true
cloud:
nacos:
username: ${nacos.username}
password: ${nacos.password}
config:
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
# 用于共享的配置文件
shared-configs:
- data-id: common-mysql.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-redis.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-base.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
# 常規(guī)配置文件
# 優(yōu)先級大于 shared-configs修械,在 shared-configs 之后加載
extension-configs:
- data-id: nacos-config-advanced.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
- data-id: nacos-config-base.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
參數(shù)解析:
- data-id : Data Id
- group:自定義 Data Id 所在的組,不明確配置的話检盼,默認(rèn)是 DEFAULT_GROUP肯污。
- refresh: 控制該 Data Id 在配置變更時,是否支持應(yīng)用中可動態(tài)刷新吨枉, 感知到最新的配置值蹦渣。默認(rèn)是不支持的。
注意:這里的Data ID
后面是加.yaml
后綴的貌亭,且不需要指定file-extension
柬唯。
三、共享配置和擴(kuò)展配置的區(qū)
實(shí)際上圃庭,Nacos中并未對extension-configs
和shared-configs
的差別進(jìn)?詳細(xì)闡述锄奢。我們從他們的結(jié)構(gòu),看不出本質(zhì)差別剧腻;除了優(yōu)先級不同以外拘央,也沒有其他差別。那么书在,Nacos項(xiàng)?組為什么要引?兩個類似的配置呢?我們可以從當(dāng)初該功能的需求(issue)上找到其原始?的灰伟。
3.1 Nacos對配置的默認(rèn)理念
-
namespace
區(qū)分環(huán)境:開發(fā)環(huán)境、測試環(huán)境儒旬、預(yù)發(fā)布環(huán)境栏账、?產(chǎn)環(huán)境。 -
group
區(qū)分不同應(yīng)?:同?個環(huán)境內(nèi)义矛,不同應(yīng)?的配置发笔,通過group
來區(qū)分。
3.2 主配置是應(yīng)?專有的配置
因此凉翻,主配置應(yīng)當(dāng)在dataId
上要區(qū)分,同時最好還要有group
的區(qū)分捻激,因?yàn)?code>group區(qū)分應(yīng)?(雖然dataId
上區(qū)分了制轰,不?設(shè)置group
也能按應(yīng)?單獨(dú)加載)。
3.3 要在各應(yīng)?之間共享?個配置胞谭,請使?上?的 shared-configs
因此按該理念垃杖,shared-configs
指定的配置,本來應(yīng)該是不指定group
的丈屹,也就是應(yīng)當(dāng)歸?DEFAULT_GROUP
這個公共分組调俘。
3.4 如果要在特定范圍內(nèi)(?如某個應(yīng)?上)覆蓋某個共享dataId上的特定屬性伶棒,請使? extension-config
?如,其他應(yīng)?的數(shù)據(jù)庫url彩库,都是?個固定的url肤无,使?shared-configs.dataId = mysql
的共享配置。但其中有?個應(yīng)?ddd-demo
是特例骇钦,需要為該應(yīng)?配置擴(kuò)展屬性來覆蓋宛渐。
spring:
application:
name: ddd-demo-service
cloud:
nacos:
config:
server-addr: nacos-2.nacos-headless.public.svc.cluster.local:8848
namespace: ygjpro-test2
group: ddd-demo
......
shared-configs[3]:
data-id: mysql.yaml
refresh: true
......
extension-configs[3]:
data-id: mysql.yaml
group: ddd-demo
refresh: true
3.5 關(guān)于優(yōu)先級
1、上述兩類配置都是數(shù)組眯搭,對同種配置窥翩,數(shù)組元素對應(yīng)的下標(biāo)越?,優(yōu)先級越?鳞仙。也就是排在后?的相同配置寇蚊,將覆蓋排在前?的同名配置。
同為擴(kuò)展配置棍好,存在如下優(yōu)先級關(guān)系:
extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0
幔荒。同為共享配置,存在如下優(yōu)先級關(guān)系:
shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]
梳玫。
2爹梁、不同種類配置之間,優(yōu)先級按順序如下:主配置 > 擴(kuò)展配置(extension-configs) > 共享配置(shared-configs)