文章目錄
- 一、SpringBoot 使用 Nacos Config 實作多環境切換
- 1. 現象
- 2. 引入依賴
- 3. 添加bootstrap.yaml配置檔案
- 4. 配置對應關系圖
- 5. 檔案格式簡述
- 6. 啟動nacos
- 7. 添加生産配置
- 8. 添加測試controller
- 9. 啟動Springboot工程并觀察到如下日志則為成功
- 10. 浏覽器驗證
- 11. 調整激活環境
- 12. 建立test環境配置
- 13. test配置關系圖
- 14. 測試方法
- 15. 重新開機springboot服務,監控控制台輸出
- 16. 浏覽器驗證
- 17. 配置修改實時生效
- 18. 不同環境配置動态切換如何實作?
- 二、如何解決不同環境相同配置的問題
- 2.1. 現象
- 2.2. 添加配置
- 2.3. 增加測試方法
- 2.4. 重新啟動項目,觀察控制台
- 2.5. 浏覽器驗證
- 三、如果同一個配置項在三個配置檔案中都存在且值不同,最終項目讀取是哪個呢?
- 3.1. 驗證思路
- 3.2. 添加相同配置
- 3.3. 浏覽器驗證
- 四、不同微服務之間相同配置如何共享
- 4.1. 解決方案簡述
- 4.2. 通過shard-configs配置方式
- 4.3. 如何添加多個shared-configs配置呢?
- 4.4. 通過extension-configs方式
- 4.5. 配置實時重新整理測試驗證
- 五、多個shard-configs的檔案中存在相同的配置
- 5.1. 思考1
- 5.2. 分析驗證思路
- 5.3. 驗證流程
- 5.4. 流程實戰
- 六、配置檔案優先級
- 6.1. springboot
- 6.2. nacos
一、SpringBoot 使用 Nacos Config 實作多環境切換
1. 現象
在日常開發過程中,對于同一個服務或者項目工程在不同的環境所需要的配置是不同的。如通路資料庫、redis或者MQ其他中間件,往往需要進行環境隔離,如果每次部署都需要去修改配置檔案的話,是十分不方面的。在微服務場景下,這個問題尤為突出,因為代碼工程的數量是傳統單項目的幾十倍。需要建築一些元件,在不修改配置穩健的前提下動态的切換運作環境。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>
<!--服務注冊發現-->
<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服務位址
config:
file-extension: yaml # 表示支援擴充的檔案名
application:
name: nacos-config # 表示目前微服務需要向配置中心索要nacos-config的配置
profiles:
active: prod # 表示我需要向配置中心索要生産環境的配置
4. 配置對應關系圖
在Nacos Config 配置管理中新增配置如圖以及其對應關系如下:
5. 檔案格式簡述
索要檔案的格式為${application.name}-spring。profiles.active.{file-extension}
展現在nacos中,對應尚曼的格式Data id得知應該是nacos-config-prod.yaml
6. 啟動nacos
官網:
https://nacos.io/zh-cn/docs/quick-start.html
# 啟動指令(standalone代表着單機模式運作,非叢集模式):
# linux
sh startup.sh -m standalone
# Windows
http://localhost:8848/nacos/ 賬号/密碼:nacos/nacos
7. 添加生産配置
标簽 | 值 | 說明 |
Data ID | nacos-config-prod.yaml | |
Group | DEFAULT_GROUP | 預設,可以自定義 |
描述 | 簡述生産環境配置 | |
配置格式 | yaml | 檔案擴充名選擇 |
配置内容 | nacosProd: Production environment configuration | 和配置yml檔案格式文法一樣 |
8. 添加測試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. 啟動Springboot工程并觀察到如下日志則為成功
10. 浏覽器驗證
打開浏覽器通路http://localhost:8080/nacosProd驗證測試結果結果如圖:
11. 調整激活環境
修改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 # 表示我需要向配置中心索要生産環境的配置
12. 建立test環境配置
在nacos中建立data_id為nacos-config-test.yaml,并添加相同的配置參數,把環境參數的内容調整為test測試環境的
13. test配置關系圖
14. 測試方法
添加test測試環境方法,把剛才生産的方法注釋掉,因為咱們現在激活的是test測試環境的配置
("${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服務,監控控制台輸出
16. 浏覽器驗證
打開浏覽器通路http://localhost:8080/nacosTest驗證測試結果結果如圖:
17. 配置修改實時生效
在修改nacos中修改配置實時生效測試
修改前配置:
修改後配置:
釋出規則
不停止項目服務,打開浏覽器通路http://localhost:8080/nacosTest驗證測試結果結果如圖:
其他環境同上這裡就不一一驗證了。
18. 不同環境配置動态切換如何實作?
這裡示範修改配置檔案,到正式環境,激活那個環境配置是在指令腳本中配置好的
會采用下面這種方式激活環境配置,這個指令配置環境的優先級比項目中的配置檔案中的優先級高
java -jar xxx.jar -Dspring.profiles.active=test
二、如何解決不同環境相同配置的問題
2.1. 現象
在實際的開發過程中,我們的工程項目所用到的配置參數大多數并不需要根據不同的環境進行區分,生産、測試、開發環境所用到的參數值是相同的。如何解決同一服務在多環境中,引用相同配置的問題呢?Nacos Config也提供了相應的解決方案。
2.2. 添加配置
在Nacos Config中添加配置,data_id為nacos-config.yaml,如圖所示:
2.3. 增加測試方法
在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;
}
2.4. 重新啟動項目,觀察控制台
2.5. 浏覽器驗證
打開浏覽器通路http://localhost:8080/nacosTest驗證測試結果結果如圖:
打開浏覽器通路http://localhost:8080/nacosCommon驗證測試結果結果如圖:
從上面測試可以看出,通路test環境獨有的配置可以正常通路。通路項目中共有相同的配置也正常。
此時,我們已經在nacos中配置了3個配置檔案,nacos-config-prod.yaml、nacos-config-test.yaml和nacos-config.yaml
三、如果同一個配置項在三個配置檔案中都存在且值不同,最終項目讀取是哪個呢?
3.1. 驗證思路
驗證這個其實很簡單,隻需要在環境獨有的配置中配置共有相同配置檔案中相同的配置标簽讓他值不一樣,浏覽器通路不就知道了,對吧?
這樣,示範在
nacos-config-test.yaml
檔案中配置nacos-config.yaml檔案中nacosCommon标簽,給他賦予不同的值進行測試。
3.2. 添加相同配置
nacos-config.yaml檔案中原配置:
在
nacos-config-test.yaml
檔案中配置nacosCommon标簽值為
添加相同配置
在測試配置中添加與公用配置一樣的标簽屬性值不同,觀察誰的配置生效即可
nacosTest: Test environment configuration v2
nacosCommon: Common Environment Configuration 測試配置檔案中,配置相同屬性值不同的測試案例
規則釋出
3.3. 浏覽器驗證
打開浏覽器通路http://localhost:8080/nacosCommon驗證測試結果結果如圖:
實際讀取的配置資訊是從
nacos-config-test.yaml
檔案中讀取的。
結論:如果配置了spring.profiles.active,則優先擷取nacos-config-{spring.profiles.active}.yaml中的值。
四、不同微服務之間相同配置如何共享
4.1. 解決方案簡述
像這種共有中間件的配置資訊企業會采用單獨的配置檔案來維護,Nacos Config為我們提供了二種配置方式來解決此類場景的問題,分别是extension-configs和shard-configs配置方式。
4.2. 通過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 # 表示我需要向配置中心索要生産環境的配置
添加測試方法
("${redisip}")
private String redisip;
@GetMapping("/redisip")
public String getredisip() {
return redisip;
}
打開浏覽器通路http://localhost:8080/redisip驗證測試結果結果如圖:
http://localhost:8080/redisip
4.3. 如何添加多個shared-configs配置呢?
在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驗證測試結果結果如圖:
4.4. 通過extension-configs方式
修改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的配置資訊
4.5. 配置實時重新整理測試驗證
在nacos中修改redis.yaml和mq.yaml的資訊,不重新開機項目,直接通路浏覽器,驗證配置是否生效
redis.yaml原配置:
mq.yaml修改後配置:
mq.yaml原配置:
mq.yaml修改後配置:
通路
http://localhost:8080/redisip
和
http://localhost:8080/mqip
驗證
五、多個shard-configs的檔案中存在相同的配置
5.1. 思考1
如果多個shard-configs的檔案中存在相同的配置,最終會以那個配置檔案中的值為準?
5.2. 分析驗證思路
這樣場景例如:在redis.yaml和mq.yaml配置檔案中有一個相同的配置屬性但是值不一樣,然後在項目中存在多個shard-configs的檔案,到底優先擷取誰的配置問價心中的資訊呢?對吧
5.3. 驗證流程
- 1.在nacos上在redis.yaml和mq.yaml配置檔案中都配置一個屬性為port的屬性,redis.yaml檔案中配置6379,和mq.yaml配置檔案中port配置5672
- 2.在項目中的bootstrap.yaml中配置多個shard-configs
- 3.在測試類中添加測試方法
- 4.浏覽器驗證
- 5.得出結論
5.4. 流程實戰
- 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.在測試類中添加測試方法
("/port")
public String getport() {
return port;
}
-
4.浏覽器驗證
http://localhost:8080/port
-
5.得出結論
結論:會以數組最後一個配置檔案内容為準
六、配置檔案優先級
6.1. springboot
提示springboot配置檔案優先級
(bootstrap.ptoterties > bootstrap.yaml > application.ptoterties > bootstrap.yaml)
6.2. nacos
如果同時在extension-configs和shard-configs存在相同的配置,最終會以那個檔案中的值為準?
總結下configdemo.yaml、configdemo-test.yaml、和shard-configs、extension-configs讀取優先級
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 拉取相關的配置。