Spring Cloud Alibaba Nacos Config進(jìn)階使用
一、SpringBoot 使用 Nacos Config 實(shí)現(xiàn)多環(huán)境切換
1. 現(xiàn)象
在日常開發(fā)過程中,對(duì)于同一個(gè)服務(wù)或者項(xiàng)目工程在不同的環(huán)境所需要的配置是不同的。如訪問數(shù)據(jù)庫(kù)、redis或者M(jìn)Q其他中間件,往往需要進(jìn)行環(huán)境隔離,如果每次部署都需要去修改配置文件的話,是十分不方面的。在微服務(wù)場(chǎng)景下,這個(gè)問題尤為突出,因?yàn)榇a工程的數(shù)量是傳統(tǒng)單項(xiàng)目的幾十倍。需要建筑一些組件,在不修改配置穩(wěn)健的前提下動(dòng)態(tài)的切換運(yùn)行環(huán)境。Nacos Config提供了類似的解決方案。
2. 引入依賴
在pom文件中添加Nacos Config的依賴包,注意版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--服務(wù)注冊(cè)發(fā)現(xiàn)--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!--spring-cloud-alibaba 版本控制--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
3. 添加bootstrap.yaml配置文件
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址 config: file-extension: yaml # 表示支持?jǐn)U展的文件名 application: name: nacos-config # 表示當(dāng)前微服務(wù)需要向配置中心索要nacos-config的配置 profiles: active: prod # 表示我需要向配置中心索要生產(chǎn)環(huán)境的配置
4. 配置對(duì)應(yīng)關(guān)系圖
在Nacos Config 配置管理中新增配置如圖以及其對(duì)應(yīng)關(guān)系如下:
5. 文件格式簡(jiǎn)述
索要文件的格式為${application.name}-spring。profiles.active.{file-extension}
體現(xiàn)在nacos中,對(duì)應(yīng)尚曼的格式Data id得知應(yīng)該是nacos-config-prod.yaml
6. 啟動(dòng)nacos
官網(wǎng):
https://nacos.io/zh-cn/docs/quick-start.html
# 啟動(dòng)命令(standalone代表著單機(jī)模式運(yùn)行,非集群模式): # linux sh startup.sh -m standalone # Windows startup.cmd -m standalone
http://localhost:8848/nacos/
賬號(hào)/密碼:nacos/nacos
7. 添加生產(chǎn)配置
標(biāo)簽 | 值 | 說明 |
---|---|---|
Data ID | nacos-config-prod.yaml | |
Group | DEFAULT_GROUP | 默認(rèn),可以自定義 |
描述 | 簡(jiǎn)述生產(chǎn)環(huán)境配置 | |
配置格式 | yaml | 文件擴(kuò)展名選擇 |
配置內(nèi)容 | nacosProd: Production environment configuration | 和配置yml文件格式語法一樣 |
8. 添加測(cè)試controller
package com.gblfy.alibab.nacosconfig.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class NacosConfigController { @Value("${nacosProd}") private String nacosProd; @GetMapping("/nacosProd") public String getNacosProd() { return nacosProd; } }
9. 啟動(dòng)Springboot工程并觀察到如下日志則為成功
10. 瀏覽器驗(yàn)證
打開瀏覽器訪問http://localhost:8080/nacosProd驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
11. 調(diào)整激活環(huán)境
修改bootstrap.yaml文件中激活環(huán)境調(diào)整為test環(huán)境spring.profiles.active.test
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址 config: file-extension: yaml # 表示支持?jǐn)U展的文件名 application: name: nacos-config # 表示當(dāng)前微服務(wù)需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產(chǎn)環(huán)境的配置
12. 新建test環(huán)境配置
在nacos中新建data_id為nacos-config-test.yaml,并添加相同的配置參數(shù),把環(huán)境參數(shù)的內(nèi)容調(diào)整為test測(cè)試環(huán)境的
13. test配置關(guān)系圖
14. 測(cè)試方法
添加test測(cè)試環(huán)境方法,把剛才生產(chǎn)的方法注釋掉,因?yàn)樵蹅儸F(xiàn)在激活的是test測(cè)試環(huán)境的配置
// @Value("${nacosProd}") // private String nacosProd; // // @GetMapping("/nacosProd") // public String getNacosProd() { // return nacosProd; // } @Value("${nacosTest}") private String nacosTest; @GetMapping("/nacosTest") public String getNacosTest() { return nacosTest; }
15. 重啟springboot服務(wù),監(jiān)控控制臺(tái)輸出
16. 瀏覽器驗(yàn)證
打開瀏覽器訪問http://localhost:8080/nacosTest驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
17. 配置修改實(shí)時(shí)生效
在修改nacos中修改配置實(shí)時(shí)生效測(cè)試
修改前配置:
修改后配置:
發(fā)布規(guī)則
不停止項(xiàng)目服務(wù),打開瀏覽器訪問http://localhost:8080/nacosTest驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
其他環(huán)境同上這里就不一一驗(yàn)證了。
18. 不同環(huán)境配置動(dòng)態(tài)切換如何實(shí)現(xiàn)?
這里演示修改配置文件,到正式環(huán)境,激活那個(gè)環(huán)境配置是在命令腳本中配置好的
會(huì)采用下面這種方式激活環(huán)境配置,這個(gè)命令配置環(huán)境的優(yōu)先級(jí)比項(xiàng)目中的配置文件中的優(yōu)先級(jí)高
java -jar xxx.jar -Dspring.profiles.active=test
二、如何解決不同環(huán)境相同配置的問題
2.1. 現(xiàn)象
在實(shí)際的開發(fā)過程中,我們的工程項(xiàng)目所用到的配置參數(shù)大多數(shù)并不需要根據(jù)不同的環(huán)境進(jìn)行區(qū)分,生產(chǎn)、測(cè)試、開發(fā)環(huán)境所用到的參數(shù)值是相同的。如何解決同一服務(wù)在多環(huán)境中,引用相同配置的問題呢?Nacos Config也提供了相應(yīng)的解決方案。
2.2. 添加配置
在Nacos Config中添加配置,data_id為nacos-config.yaml,如圖所示:
2.3. 增加測(cè)試方法
在NacosConfigController類中添加讀取項(xiàng)目中共有相同配置的方法進(jìn)行測(cè)試
// @Value("${nacosProd}") // private String nacosProd; // // @GetMapping("/nacosProd") // public String getNacosProd() { // return nacosProd; // } @Value("${nacosTest}") private String nacosTest; @GetMapping("/nacosTest") public String getNacosTest() { return nacosTest; } @Value("${nacosCommon}") private String nacosCommon; @GetMapping("/nacosCommon") public String getNacosCommon() { return nacosCommon; }
2.4. 重新啟動(dòng)項(xiàng)目,觀察控制臺(tái)
2.5. 瀏覽器驗(yàn)證
打開瀏覽器訪問http://localhost:8080/nacosTest驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
打開瀏覽器訪問http://localhost:8080/nacosCommon驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
從上面測(cè)試可以看出,訪問test環(huán)境獨(dú)有的配置可以正常訪問。訪問項(xiàng)目中共有相同的配置也正常。
此時(shí),我們已經(jīng)在nacos中配置了3個(gè)配置文件,nacos-config-prod.yaml、nacos-config-test.yaml和nacos-config.yaml
三、如果同一個(gè)配置項(xiàng)在三個(gè)配置文件中都存在且值不同,最終項(xiàng)目讀取是哪個(gè)呢?
3.1. 驗(yàn)證思路
驗(yàn)證這個(gè)其實(shí)很簡(jiǎn)單,只需要在環(huán)境獨(dú)有的配置中配置共有相同配置文件中相同的配置標(biāo)簽讓他值不一樣,瀏覽器訪問不就知道了,對(duì)吧?
這樣,演示在nacos-config-test.yaml
文件中配置nacos-config.yaml文件中nacosCommon標(biāo)簽,給他賦予不同的值進(jìn)行測(cè)試。
3.2. 添加相同配置
nacos-config.yaml文件中原配置:
在nacos-config-test.yaml
文件中配置nacosCommon標(biāo)簽值為
添加相同配置
在測(cè)試配置中添加與公用配置一樣的標(biāo)簽屬性值不同,觀察誰的配置生效即可
nacosTest: Test environment configuration v2 nacosCommon: Common Environment Configuration 測(cè)試配置文件中,配置相同屬性值不同的測(cè)試案例
規(guī)則發(fā)布
3.3. 瀏覽器驗(yàn)證
打開瀏覽器訪問http://localhost:8080/nacosCommon驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
實(shí)際讀取的配置信息是從nacos-config-test.yaml
文件中讀取的。
結(jié)論:如果配置了spring.profiles.active,則優(yōu)先獲取nacos-config-{spring.profiles.active}.yaml中的值。
四、不同微服務(wù)之間相同配置如何共享
4.1. 解決方案簡(jiǎn)述
像這種共有中間件的配置信息企業(yè)會(huì)采用單獨(dú)的配置文件來維護(hù),Nacos Config為我們提供了二種配置方式來解決此類場(chǎng)景的問題,分別是extension-configs和shard-configs配置方式。
4.2. 通過shard-configs配置方式
在nacos中新建redis.yaml,添加配置信息,reidsip:127.0.0.1,然后,配置信息發(fā)布生效
修改項(xiàng)目的bootstrap.yaml的配置文件,添加配置spring.cloud.nacos.config.shared-configs[0]
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址 config: file-extension: yaml # 表示支持?jǐn)U展的文件名 shared-configs[0]: data_id: redis.yaml refresh: true # 默認(rèn)是false 如果需要支持自動(dòng)刷新,需要配置true,搭配@RefreshScope實(shí)現(xiàn)動(dòng)態(tài)刷新 #group: # 可以不寫 默認(rèn)DEFAULT_GROUP application: name: nacos-config # 表示當(dāng)前微服務(wù)需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產(chǎn)環(huán)境的配置
添加測(cè)試方法
@Value("${redisip}") private String redisip; @GetMapping("/redisip") public String getredisip() { return redisip; }
打開瀏覽器訪問http://localhost:8080/redisip驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
http://localhost:8080/redisip
4.3. 如何添加多個(gè)shared-configs配置呢?
在nacos中新建mq.yaml,添加配置信息mqip: 127.0.0.2
修改項(xiàng)目的bootstrap.yaml問阿金,并添加shared-configs[1]:配置,具體配置線如下:
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址 config: file-extension: yaml # 表示支持?jǐn)U展的文件名 shared-configs[0]: data_id: redis.yaml refresh: true # 默認(rèn)是false 如果需要支持自動(dòng)刷新,需要配置true,搭配@RefreshScope實(shí)現(xiàn)動(dòng)態(tài)刷新 #group: # 可以不寫 默認(rèn)DEFAULT_GROUP shared-configs[1]: data_id: mq.yaml refresh: true # 默認(rèn)是false 如果需要支持自動(dòng)刷新,需要配置true,搭配@RefreshScope實(shí)現(xiàn)動(dòng)態(tài)刷新 #group: # 可以不寫 默認(rèn)DEFAULT_GROUP application: name: nacos-config # 表示當(dāng)前微服務(wù)需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產(chǎn)環(huán)境的配置
新增一個(gè)獲取mq信息的url以及方法
package com.gblfy.alibab.nacosconfig.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class NacosConfigController { // @Value("${nacosProd}") // private String nacosProd; // // @GetMapping("/nacosProd") // public String getNacosProd() { // return nacosProd; // } @Value("${nacosTest}") private String nacosTest; @GetMapping("/nacosTest") public String getNacosTest() { return nacosTest; } @Value("${nacosCommon}") private String nacosCommon; @GetMapping("/nacosCommon") public String getNacosCommon() { return nacosCommon; } @Value("${redisip}") private String redisip; @GetMapping("/redisip") public String getredisip() { return redisip; } @Value("${mqip}") private String mqip; @GetMapping("/mqip") public String getmqip() { return mqip; } }
打開瀏覽器訪問http://localhost:8080/mqip驗(yàn)證測(cè)試結(jié)果結(jié)果如圖:
4.4. 通過extension-configs方式
修改bootstrap.yaml文件,刪除shared-configs相關(guān)配置,增加extension-configs[0]和extension-configs[1]的配置如下:
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址 config: file-extension: yaml # 表示支持?jǐn)U展的文件名 extension-configs[0]: # shared-configs是一個(gè)列表 List<Config> sharedConfigs data_id: redis.yaml refresh: true # 默認(rèn)是false 如果需要支持自動(dòng)刷新,需要配置true,搭配@RefreshScope實(shí)現(xiàn)動(dòng)態(tài)刷新 extension-configs[1]: # shared-configs是一個(gè)列表 List<Config> sharedConfigs data_id: mq.yaml refresh: true # 默認(rèn)是false 如果需要支持自動(dòng)刷新,需要配置true,搭配@RefreshScope實(shí)現(xiàn)動(dòng)態(tài)刷新 #group: # 可以不寫 默認(rèn)DEFAULT_GROUP application: name: nacos-config # 表示當(dāng)前微服務(wù)需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產(chǎn)環(huán)境的配置
重新啟動(dòng)項(xiàng)目,分別訪問http://localhost:8080/redisip和http://localhost:8080/mqip驗(yàn)證是否可以正常讀取redis.yaml和mq.yaml的配置信息
4.5. 配置實(shí)時(shí)刷新測(cè)試驗(yàn)證
在nacos中修改redis.yaml和mq.yaml的信息,不重啟項(xiàng)目,直接訪問瀏覽器,驗(yàn)證配置是否生效
redis.yaml原配置:
mq.yaml修改后配置:
mq.yaml原配置:
mq.yaml修改后配置:
訪問http://localhost:8080/redisip和http://localhost:8080/mqip驗(yàn)證
五、多個(gè)shard-configs的文件中存在相同的配置
5.1. 思考1
如果多個(gè)shard-configs的文件中存在相同的配置,最終會(huì)以那個(gè)配置文件中的值為準(zhǔn)?
5.2. 分析驗(yàn)證思路
這樣場(chǎng)景
例如:在redis.yaml和mq.yaml配置文件中有一個(gè)相同的配置屬性但是值不一樣,然后在項(xiàng)目中存在多個(gè)shard-configs的文件,到底優(yōu)先獲取誰的配置問價(jià)心中的信息呢?對(duì)吧
5.3. 驗(yàn)證流程
- 1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一個(gè)屬性為port的屬性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672
- 2.在項(xiàng)目中的bootstrap.yaml中配置多個(gè)shard-configs
- 3.在測(cè)試類中添加測(cè)試方法
- 4.瀏覽器驗(yàn)證
- 5.得出結(jié)論
5.4. 流程實(shí)戰(zhàn)
- 1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一個(gè)屬性為port的屬性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672
- 2.在項(xiàng)目中的bootstrap.yaml中配置多個(gè)shard-configs
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址 config: file-extension: yaml # 表示支持?jǐn)U展的文件名 extension-configs[0]: # shared-configs是一個(gè)列表 List<Config> sharedConfigs data_id: redis.yaml refresh: true # 默認(rèn)是false 如果需要支持自動(dòng)刷新,需要配置true,搭配@RefreshScope實(shí)現(xiàn)動(dòng)態(tài)刷新 extension-configs[1]: # shared-configs是一個(gè)列表 List<Config> sharedConfigs data_id: mq.yaml refresh: true # 默認(rèn)是false 如果需要支持自動(dòng)刷新,需要配置true,搭配@RefreshScope實(shí)現(xiàn)動(dòng)態(tài)刷新 #group: # 可以不寫 默認(rèn)DEFAULT_GROUP application: name: nacos-config # 表示當(dāng)前微服務(wù)需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產(chǎn)環(huán)境的配置
- 3.在測(cè)試類中添加測(cè)試方法
@GetMapping("/port") public String getport() { return port; }
- 4.瀏覽器驗(yàn)證
- 5.得出結(jié)論
結(jié)論:會(huì)以數(shù)組最后一個(gè)配置文件內(nèi)容為準(zhǔn)
六、配置文件優(yōu)先級(jí)
6.1. springboot
提示springboot配置文件優(yōu)先級(jí)
(bootstrap.ptoterties > bootstrap.yaml > application.ptoterties > bootstrap.yaml)
6.2. nacos
如果同時(shí)在extension-configs和shard-configs存在相同的配置,最終會(huì)以那個(gè)文件中的值為準(zhǔn)?
總結(jié)下configdemo.yaml、configdemo-test.yaml、和shard-configs、extension-configs讀取優(yōu)先級(jí)
extension-configs: - data-id: shareconfig3.yml group: share3_group refresh: true - data-id: shareconfig3.yml group: share4_group refresh: true shared-configs: - data-id: shareconfig1.yml refresh: true - data-id: shareconfig2.yml refresh: true
spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,優(yōu)先級(jí)越高,因此會(huì)走group=share4_group的配置。
spring.cloud.nacos.config.shared-configs[n].data-id默認(rèn)跟上面一樣的邏輯。
不同方式配置加載優(yōu)先級(jí)
Spring Cloud Alibaba Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關(guān)的配置。
A: 通過 spring.cloud.nacos.config.shared-configs[n].data-id 支持多個(gè)共享 Data Id 的配置
B: 通過 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多個(gè)擴(kuò)展 Data Id 的配置
C: 通過內(nèi)部相關(guān)規(guī)則(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group)自動(dòng)生成相關(guān)的 Data Id 配置
當(dāng)三種方式共同使用時(shí),他們的一個(gè)優(yōu)先級(jí)關(guān)系是:A < B < C
相關(guān)文章
Spring Cloud Config與Bus整合實(shí)現(xiàn)微服務(wù)配置自動(dòng)刷新功能
通過整合SpringCloud Config與Spring Cloud Bus,實(shí)現(xiàn)了微服務(wù)配置的自動(dòng)刷新功能,這個(gè)機(jī)制允許一個(gè)微服務(wù)實(shí)例在配置更新時(shí)通過消息總線通知其他所有實(shí)例同步更新,從而保持配置的一致性并提升系統(tǒng)的運(yùn)維效率2024-10-10springboot ApplicationContextInitializer的三種使用方法小結(jié)
這篇文章主要介紹了關(guān)于ApplicationContextInitializer的三種使用方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11利用Java實(shí)現(xiàn)更改Word中的頁面大小和頁面方向
這篇文章主要為大家詳細(xì)介紹了一種高效便捷的方法——通過Java應(yīng)用程序,以編程方式更改Word中的頁面大小和頁面方向,感興趣的可以了解一下2023-03-03Spring Boot集成Java DSL的實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring Boot集成Java DSL的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01詳解Java如何應(yīng)對(duì)常見的安全威脅和攻擊類型
隨著信息技術(shù)的快速發(fā)展,網(wǎng)絡(luò)安全問題日益突出,本文將以Java開發(fā)語言為例,深入探討網(wǎng)絡(luò)協(xié)議的安全性問題,通過分析常見的安全威脅和攻擊類型,設(shè)計(jì)和實(shí)施安全協(xié)議等主題,為讀者提供一些有益的思路和方法,需要的朋友可以參考下2023-11-11SpringBoot系列教程JPA之基礎(chǔ)環(huán)境搭建的方法
這篇文章主要介紹了SpringBoot系列教程JPA之基礎(chǔ)環(huán)境搭建的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06java 數(shù)值類型分秒時(shí)間格式化的實(shí)例代碼
這篇文章主要介紹了java 數(shù)值類型分秒時(shí)間格式化的實(shí)例代碼的相關(guān)資料,將秒或分鐘的值轉(zhuǎn)換為xx天xx小時(shí)xx分鐘xx秒 如果 “xx” 為0 自動(dòng)缺省,需要的朋友可以參考下2017-07-07運(yùn)用Spring?Aop+注解實(shí)現(xiàn)日志記錄
我們都知道Spring框架的兩大特性分別是 IOC (控制反轉(zhuǎn))和 AOP (面向切面),這個(gè)是每一個(gè)Spring學(xué)習(xí)視頻里面一開始都會(huì)提到的,這里,如果我們使用Aop來記錄日志,那是再好不過了,感興趣的朋友跟隨小編一起學(xué)習(xí)下Spring?Aop注解實(shí)現(xiàn)日志記錄的過程吧2022-01-01SpringBoot中基于JWT的單token授權(quán)和續(xù)期方案步驟詳解
在前后端分離架構(gòu)中,用戶登錄后,后端生成JWT?Token返給前端存于LocalStorage,每次請(qǐng)求攜帶Token驗(yàn)證身份,后端校驗(yàn)其有效性,本文給大家介紹SpringBoot中基于JWT的單token授權(quán)和續(xù)期方案步驟詳解,感興趣的朋友一起看看吧2024-09-09