Nacos多環境配置
在開發過程中,我們的項目會存在不同的運行環境,比如開發環境、測試環境、生產環境,而我們的項目在不同的環境中,有的配置可能會不一樣,比如數據源配置、日志文件配置、以及一些軟件運行過程中的基本配置,那每次我們將軟件部署到不同的環境時,都需要修改相應的配置文件,這樣來回修改,很容易出錯,而且浪費勞動力。
Nacos除了可以做注冊中心,也可以做統一配置管理(配置中心),Nacos提供了一種統一配置管理方案,可以集中管理所有實例的配置。
Nacos一方面可以將配置集中管理,另一方可以在配置變更時,及時通知微服務,實現配置的熱更新。
微服務要拉取Nacos中管理的配置,并且與本地的application.properties配置合并,才能完成項目啟動,否則項目啟動時就會報錯。
但是現在有個問題:未讀取application.properties,又如何得知nacos地址呢?
Spring引入了一種新的配置文件:bootstrap.properties文件,會在application.properties之前被讀取。
1.DataID方案
在springboot配置文件中指定spring.profile.active和Nacos配置中心的DataID來使不同環境下讀取不同的配置。
1.1 Nacos配置中心
在Nacos頁面中配置管理的配置列表創建配置:
DataID完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。因此prefix的名字需要與項目配置文件中spring.application.name 的值保持一致。
spring.profiles.active 即為當前環境對應的 profile,例如開發環境為dev,測試環境為test,生產環境為prod等。 因此這里的值需要與項目配置文件中的spring.profiles.active的值保持一致。注意:當 spring.profiles.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 𝑝𝑟𝑒𝑓𝑖𝑥.{file-extension}。
file-exetension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。支持 properties 、 yaml 和 yml 類型。
Group:分組,默認為DEFAULT_GROUP。
配置格式:目前,Springboot中能識別的配置格式只支持YAML和Properties兩個格式。
配置內容:根據自己需要配置的內容進行配置。
1.2 springboot配置
引入nacos-config依賴
<!-- 配置中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
創建bootstrap.properties
#注冊中心地址 spring.cloud.nacos.config.server-addr=localhost:8848 #與配置中心DataID的prefix一致 spring.cloud.nacos.config.prefix=productor ##與配置中心DataID的file-exetension一致 spring.cloud.nacos.config.file-extension=properties #與配置中心DataID的spring.profiles.active一致 spring.profiles.active=dev
啟動springboot項目,使用postman通過消費者遠程訪問接口,可以成功返回結果:
2.GROUP方案
我們知道Group為分組,默認為:DEFAULT_GROUP,現在我們在Nacos分出兩組,一組是“Dev開發組”,一組是“test測試組”
2.1 Nacos配置中心
2.2 springboot配置
微服務根據指定分組為dev或test進行切換。
啟動springboot項目,使用postman通過消費者遠程訪問接口,可以成功返回結果:
3.命名空間方案
我們創建命名空間, 通過切換對應的命名空間,然后再通過Group和DataID來進行切換,即可以按照Namespace+Group+DataId來切換使用不同的配置文件。
3.1 Nacos配置中心
3.1.1 創建命名空間
在Nacos頁面點擊命名空間,點擊創建命名空間
輸入要新建的空間名,點擊確定
點擊服務列表和配置列表,查看多出一個命名空間
3.1.2 配置中心新增配置文件
在test命名空間下新建配置
添加配置項:
在此,我們可以定義不同的GROUP及DataID,實現Namespace+Group+DataId來切換不同的配置文件。
3.2 springboot配置
在bootstrap.properties文件中配置namespace、group及DataID
#注冊中心地址 spring.cloud.nacos.config.server-addr=localhost:8848
#與配置中心DataID的prefix一致 spring.cloud.nacos.config.prefix=productor ##與配置中心DataID的file-exetension一致
spring.cloud.nacos.config.file-extension=properties spring.cloud.nacos.config.group=TEST_GROUP
#與配置中心DataID的spring.profiles.active一致
spring.profiles.active=test spring.cloud.nacos.config.namespace=5f8d56ea-111b-46e6-9edb-68bf92b9706b
啟動springboot項目,使用postman通過消費者遠程訪問接口,可以成功返回結果:
4.權限控制+命名空間方案
在命名空間基礎上,添加用戶權限控制,可根據不同用戶拉取該用戶所擁有的不同命名空間的配置。
4.1 權限控制
4.1.1 開啟權限控制
在nacos目錄的conf文件夾下編輯application.properties,設置:
nacos.core.auth.enabled=true
4.1.2 創建自定義用戶
在Nacos頁面上點擊用戶列表,在列表頁面點擊創建用戶
輸入用戶名和密碼,點擊確定完成用戶創建。
4.1.3 創建角色
在Nacos頁面上點擊角色管理,在管理頁面點擊綁定角色
角色名可以自定義輸入任意的名稱,用戶名輸入已經創建的用戶,點擊確定完成。
4.1.4 創建權限
在Nacos頁面上點擊權限管理,在管理頁面點擊添加權限
角色名:已經創建的角色
資源:已經創建的命名空間
動作:只讀(r)、只寫(w)、讀寫(rw)
點擊確定按鈕,完成權限添加。
在nacos頁面上退出賬號,以新創建的賬號登錄:
當訪問配置列表和服務列表的public時,提示權限認證失敗,此時配置列表中public命名空間的配置文件不能進行讀寫。
4.1.5 創建命名空間的配置文件
根據命名空間方案(文中第3中方案)創建配置文件,以test命名空間為例,創建test命名空間,在test命名空間下創建配置文件。
4.2 springboot配置
在bootstrap.properties中添加test的用戶名、密碼、命名空間配置
#注冊中心地址 spring.cloud.nacos.config.server-addr=localhost:8848
#與配置中心DataID的prefix一致 spring.cloud.nacos.config.prefix=productor #
#與配置中心DataID的file-exetension一致
spring.cloud.nacos.config.file-extension=properties spring.cloud.nacos.config.group=TEST_GROUP
#與配置中心DataID的spring.profiles.active一致
spring.profiles.active=test spring.cloud.nacos.config.namespace=5f8d56ea-111b-46e6-9edb-68bf92b9706b spring.cloud.nacos.username=test spring.cloud.nacos.password=123456
由于在Nacos中給test用戶分配了test命名空間,所以需要在application.properties中添加test的命名空間配置,在bootstrap.properties中已經配置nacos的用戶名和密碼,在這里可不配置,用戶名默認使用spring.cloud.nacos.username,密碼默認使用spring.cloud.nacos.password。
spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.cloud.nacos.discovery.service=${spring.application.name} spring.cloud.nacos.discovery.namespace=${spring.cloud.nacos.config.namespace}
4.3 測試
啟動springboot項目,使用postman通過消費者遠程訪問接口,可以成功返回結果:
將bootstrap.properties中的group、active修改為dev,啟動springboot項目則報錯:
該現象說明當group、active修改為dev后,test用戶沒有權限訪問,不能拉取nacos中dev命名空間下的配置文件,導致springboot項目啟動獲取配置文件中的配置項時失敗。