在系統開發過程中,開發者通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理運行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成。配置變更是調整系統運行時的行為的有效手段。
如果微服務架構中沒有使用統一配置中心時,所存在的問題:
-
配置文件分散在各個項目里,不方便維護
-
配置內容安全與權限
-
更新配置后,項目需要重啟
nacos配置中心:系統配置的集中管理(編輯、存儲、分發)、動態更新不重啟、回滾配置(變更管理、歷史版本管理、變更審計)等所有與配置相關的活動
Nacos與 Spring Cloud的整合:
${prefix}-${spring.profile.active}.${file-extension}
-
-
spring.profile.active
即為當前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當 spring.profile.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成${prefix}.${file-extension}
-
file-exetension
為配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension
來配置。目前只支持properties
和yaml
類型;默認為properties
;
官方文檔:
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
2.配置內容:
項目中易變的內容
添加依賴:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.1.2.RELEASE</version> </dependency>
版本說明 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
spring: application: name: nacos-provider cloud: nacos: config: server-addr: 127.0.0.1:8848 #Nacos配置中心地址 file-extension: yaml #文件拓展格式
注意:bootstrap.yml添加了spring.application.name,在appliation.yml不需要再添加;
@RefreshScope @RestController public class ProviderController { @Value("${DevConfig}") private String devConfig; @GetMapping("invoke") public String invoke() { return LocalTime.now() + " invoke,devConfig:" + devConfig; } }
調用結果:
在實際開發中,通常有多套不同的環境(默認只有public),那么這個時候可以根據指定的環境來創建不同的 namespce,例如,開發、測試和生產三個不同的環境,那么使用一套 nacos 集群可以分別建以下三個不同的 namespace。以此來實現多環境的隔離;
可以發現有四個名稱空間:public(默認)以及我們自己添加的3個名稱空間(prod、dev、test),可以點擊查看每個名稱空間下的配置文件,當然現在只有public下有一個配置;
默認情況下,項目會到public下找
接下來,在dev名稱空間中也添加一個nacos-provider.properties配置。這時有兩種方式:
-
切換到dev名稱空間,添加一個新的配置文件。缺點:每個環境都要重復配置類似的項目
-
直接通過clone方式添加配置,並修改即可(推薦)
編輯
在服務提供方nacos-provider中切換命名空間,修改bootstrap.yml添加如下配置
spring: cloud: nacos: config: namespace: 288ad42c-c8e0-4b92-b8df-7d7883ad8507
namespace的值為:
重啟服務,調用結果:
nacos-provider.properties默認加載,怎么加載另外兩個配置文件?
在bootstrap.yml文件中添加如下配置:
spring: cloud: nacos: server-addr: 127.0.0.1:8848 config: extension-configs: - refresh: true data-id: redis.properties - refresh: true data-id: jdbc.properties
修改上面的代碼:
@RefreshScope @RestController public class ProviderController { @Value("${DevConfig}") private String devConfig; @Value("${jdbc.url}") private String jdbcUrl; @Value("${redis.url}") private String redisUrl; @GetMapping("invoke") public String invoke() { return LocalTime.now() + " invoke,devConfig:" + devConfig + ",jdbcUrl:" + jdbcUrl + ",redisUrl:" + redisUrl; } }
在實際開發中,除了不同的環境外。不同的微服務或者業務功能,可能有不同的redis及mysql數據庫,也就說每個微服務項目可能會有相應的開發環境,測試環境,預發環境,生產環境等;
區分不同的環境我們使用名稱空間(namespace),區分不同的微服務或功能,使用分組(group)。
也可以反過來使用,名稱空間和分組只是為了更好的區分配置,提供的兩個維度而已;
新增一個redis.properties,所屬分組為nacos-provider:
現在開發環境中有兩個redis.propertis配置文件,一個是默認分組(DEFAULT_GROUP),一個是provider組
默認情況下從DEFAULT_GROUP分組中讀取redis.properties,如果要切換到nacos-provider分組下的redis.properties,需要修改如下配置:
spring: cloud: nacos: server-addr: 127.0.0.1:8848 config: extension-configs: - refresh: true group: nacos-provider data-id: redis.properties - refresh: true data-id: jdbc.properties
- Nacos配置持久化
注:Nacos如果不修改配置,Nacos作為配置中心保存的配置數據是保存在內存的,也就是當Nacos服務重啟后,之前保存的數據就會清空的;
如何將配置數據進行持久化?
需要配置使用的數據源;
參考:[https://nacos.io/zh-cn/docs/deployment.html]
參考:[https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html]
sql語句:[https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql]
application.properties:[https://github.com/alibaba/nacos/blob/master/distribution/conf/application.properties]
修改完配置后,重啟Nacos服務,Nacos的數據就可以持久化了;