您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關SpringBoot如何使用Nacos Config實現多環境切換的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在日常開發過程中,對于同一個服務或者項目工程在不同的環境所需要的配置是不同的。如訪問數據庫、redis或者MQ其他中間件,往往需要進行環境隔離,如果每次部署都需要去修改配置文件的話,是十分不方面的。在微服務場景下,這個問題尤為突出,因為代碼工程的數量是傳統單項目的幾十倍。需要建筑一些組件,在不修改配置穩健的前提下動態的切換運行環境。Nacos Config提供了類似的解決方案。
在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> <!--服務注冊發現--> <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>
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務地址 config: file-extension: yaml # 表示支持擴展的文件名 application: name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置 profiles: active: prod # 表示我需要向配置中心索要生產環境的配置
在Nacos Config 配置管理中新增配置如圖以及其對應關系如下:
索要文件的格式為${application.name}-spring。profiles.active.{file-extension}
體現在nacos中,對應尚曼的格式Data id得知應該是nacos-config-prod.yaml
官網:
https://nacos.io/zh-cn/docs/quick-start.html
# 啟動命令(standalone代表著單機模式運行,非集群模式): # linux sh startup.sh -m standalone # Windows startup.cmd -m standalone
http://localhost:8848/nacos/
賬號/密碼:nacos/nacos
標簽 | 值 | 說明 |
---|---|---|
Data ID | nacos-config-prod.yaml | |
Group | DEFAULT_GROUP | 默認,可以自定義 |
描述 | 簡述生產環境配置 | |
配置格式 | yaml | 文件擴展名選擇 |
配置內容 | nacosProd: Production environment configuration | 和配置yml文件格式語法一樣 |
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; } }
打開瀏覽器訪問http://localhost:8080/nacosProd驗證測試結果結果如圖:
修改bootstrap.yaml文件中激活環境調整為test環境spring.profiles.active.test
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務地址 config: file-extension: yaml # 表示支持擴展的文件名 application: name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產環境的配置
在nacos中新建data_id為nacos-config-test.yaml,并添加相同的配置參數,把環境參數的內容調整為test測試環境的
添加test測試環境方法,把剛才生產的方法注釋掉,因為咱們現在激活的是test測試環境的配置
// @Value("${nacosProd}") // private String nacosProd; // // @GetMapping("/nacosProd") // public String getNacosProd() { // return nacosProd; // } @Value("${nacosTest}") private String nacosTest; @GetMapping("/nacosTest") public String getNacosTest() { return nacosTest; }
打開瀏覽器訪問http://localhost:8080/nacosTest驗證測試結果結果如圖:
在修改nacos中修改配置實時生效測試
修改前配置:
修改后配置:
發布規則
不停止項目服務,打開瀏覽器訪問http://localhost:8080/nacosTest驗證測試結果結果如圖:
其他環境同上這里就不一一驗證了。
這里演示修改配置文件,到正式環境,激活那個環境配置是在命令腳本中配置好的
會采用下面這種方式激活環境配置,這個命令配置環境的優先級比項目中的配置文件中的優先級高
java -jar xxx.jar -Dspring.profiles.active=test
在實際的開發過程中,我們的工程項目所用到的配置參數大多數并不需要根據不同的環境進行區分,生產、測試、開發環境所用到的參數值是相同的。如何解決同一服務在多環境中,引用相同配置的問題呢?Nacos Config也提供了相應的解決方案。
在Nacos Config中添加配置,data_id為nacos-config.yaml,如圖所示:
在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; }
打開瀏覽器訪問http://localhost:8080/nacosTest驗證測試結果結果如圖:
打開瀏覽器訪問http://localhost:8080/nacosCommon驗證測試結果結果如圖:
從上面測試可以看出,訪問test環境獨有的配置可以正常訪問。訪問項目中共有相同的配置也正常。
此時,我們已經在nacos中配置了3個配置文件,nacos-config-prod.yaml、nacos-config-test.yaml和nacos-config.yaml
驗證這個其實很簡單,只需要在環境獨有的配置中配置共有相同配置文件中相同的配置標簽讓他值不一樣,瀏覽器訪問不就知道了,對吧?
這樣,演示在nacos-config-test.yaml
文件中配置nacos-config.yaml文件中nacosCommon標簽,給他賦予不同的值進行測試。
nacos-config.yaml文件中原配置:
在nacos-config-test.yaml
文件中配置nacosCommon標簽值為
添加相同配置
在測試配置中添加與公用配置一樣的標簽屬性值不同,觀察誰的配置生效即可
nacosTest: Test environment configuration v2 nacosCommon: Common Environment Configuration 測試配置文件中,配置相同屬性值不同的測試案例
規則發布
打開瀏覽器訪問http://localhost:8080/nacosCommon驗證測試結果結果如圖:
實際讀取的配置信息是從nacos-config-test.yaml
文件中讀取的。
結論:如果配置了spring.profiles.active,則優先獲取nacos-config-{spring.profiles.active}.yaml中的值。
像這種共有中間件的配置信息企業會采用單獨的配置文件來維護,Nacos Config為我們提供了二種配置方式來解決此類場景的問題,分別是extension-configs和shard-configs配置方式。
在nacos中新建redis.yaml,添加配置信息,reidsip:127.0.0.1,然后,配置信息發布生效
修改項目的bootstrap.yaml的配置文件,添加配置spring.cloud.nacos.config.shared-configs[0]
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務地址 config: file-extension: yaml # 表示支持擴展的文件名 shared-configs[0]: data_id: redis.yaml refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新 #group: # 可以不寫 默認DEFAULT_GROUP application: name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產環境的配置
添加測試方法
@Value("${redisip}") private String redisip; @GetMapping("/redisip") public String getredisip() { return redisip; }
打開瀏覽器訪問http://localhost:8080/redisip驗證測試結果結果如圖:
http://localhost:8080/redisip
在nacos中新建mq.yaml,添加配置信息mqip: 127.0.0.2
修改項目的bootstrap.yaml問阿金,并添加shared-configs[1]:配置,具體配置線如下:
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務地址 config: file-extension: yaml # 表示支持擴展的文件名 shared-configs[0]: data_id: redis.yaml refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新 #group: # 可以不寫 默認DEFAULT_GROUP shared-configs[1]: data_id: mq.yaml refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新 #group: # 可以不寫 默認DEFAULT_GROUP application: name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產環境的配置
新增一個獲取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驗證測試結果結果如圖:
修改bootstrap.yaml文件,刪除shared-configs相關配置,增加extension-configs[0]和extension-configs[1]的配置如下:
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務地址 config: file-extension: yaml # 表示支持擴展的文件名 extension-configs[0]: # shared-configs是一個列表 List<Config> sharedConfigs data_id: redis.yaml refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新 extension-configs[1]: # shared-configs是一個列表 List<Config> sharedConfigs data_id: mq.yaml refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新 #group: # 可以不寫 默認DEFAULT_GROUP application: name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產環境的配置
重新啟動項目,分別訪問http://localhost:8080/redisip和http://localhost:8080/mqip驗證是否可以正常讀取redis.yaml和mq.yaml的配置信息
在nacos中修改redis.yaml和mq.yaml的信息,不重啟項目,直接訪問瀏覽器,驗證配置是否生效
redis.yaml原配置:
mq.yaml修改后配置:
mq.yaml原配置:
mq.yaml修改后配置:
訪問http://localhost:8080/redisip和http://localhost:8080/mqip驗證
如果多個shard-configs的文件中存在相同的配置,最終會以那個配置文件中的值為準?
這樣場景
例如:在redis.yaml和mq.yaml配置文件中有一個相同的配置屬性但是值不一樣,然后在項目中存在多個shard-configs的文件,到底優先獲取誰的配置問價心中的信息呢?對吧
1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一個屬性為port的屬性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672
2.在項目中的bootstrap.yaml中配置多個shard-configs
3.在測試類中添加測試方法
4.瀏覽器驗證
5.得出結論
1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一個屬性為port的屬性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672
2.在項目中的bootstrap.yaml中配置多個shard-configs
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務地址 config: file-extension: yaml # 表示支持擴展的文件名 extension-configs[0]: # shared-configs是一個列表 List<Config> sharedConfigs data_id: redis.yaml refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新 extension-configs[1]: # shared-configs是一個列表 List<Config> sharedConfigs data_id: mq.yaml refresh: true # 默認是false 如果需要支持自動刷新,需要配置true,搭配@RefreshScope實現動態刷新 #group: # 可以不寫 默認DEFAULT_GROUP application: name: nacos-config # 表示當前微服務需要向配置中心索要nacos-config的配置 profiles: active: test # 表示我需要向配置中心索要生產環境的配置
3.在測試類中添加測試方法
@GetMapping("/port") public String getport() { return port; }
4.瀏覽器驗證
http://localhost:8080/port
5.得出結論
結論:會以數組最后一個配置文件內容為準
提示springboot配置文件優先級
(bootstrap.ptoterties > bootstrap.yaml > application.ptoterties > bootstrap.yaml)
如果同時在extension-configs和shard-configs存在相同的配置,最終會以那個文件中的值為準?
總結下configdemo.yaml、configdemo-test.yaml、和shard-configs、extension-configs讀取優先級
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 的值越大,優先級越高,因此會走group=share4_group的配置。
spring.cloud.nacos.config.shared-configs[n].data-id默認跟上面一樣的邏輯。
不同方式配置加載優先級
Spring Cloud Alibaba Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關的配置。
A: 通過 spring.cloud.nacos.config.shared-configs[n].data-id 支持多個共享 Data Id 的配置
B: 通過 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多個擴展 Data Id 的配置
C: 通過內部相關規則(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group)自動生成相關的 Data Id 配置
當三種方式共同使用時,他們的一個優先級關系是:A < B < C
感謝各位的閱讀!關于“SpringBoot如何使用Nacos Config實現多環境切換”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。