在上文 Java微服務新生代之Nacos 已經介紹了微服務框架 Nacos 以及它在服務註冊與發現的功能,本文將主要介紹它的另外一強大功能:配置管理,學習利用 Nacos 如何實現經過統一的管理界面,集中化實現分佈式服務的配置維護和實時更新。html
本文主要內容涉及以下:git
Nacos 提供了動態配置服務,能讓咱們能夠實時進行服務應用的配置變動,讓配置管理變得更加高效和快捷。它基於 key/value 方式存儲應用配置和其餘元數據信息,爲分佈式系統中的外部化配置提供服務器端和客戶端支持。github
首先了解下 Nacos 在配置管理模塊上的幾個重要概念,能幫助咱們更好的理解和正確的使用 Nacos 進行配置管理。spring
命名空間(Namespace)shell
用於進行租戶粒度的配置隔離,可用於對不一樣環境配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。bootstrap
配置項 (Configuration Item)瀏覽器
一個具體的可配置的參數與其值,一般以 param-key=param-value 的形式存在。例如咱們常配置系統的日誌輸出級別(logLevel=INFO|WARN|ERROR) 就是一個配置項。服務器
配置集 (Configuration Set)微信
一組相關或者不相關的配置項的集合。一個配置文件一般就是一個配置集,它可能包含了數據源、線程池、日誌級別等配置項。app
配置集 ID(Data ID)
某個配置集的標識 ID,用於組織劃分系統的配置集。一個系統或者應用能夠包含多個配置集。官方推薦採用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則定義 Data ID 來保證全局惟一性。
配置分組(Group)
對配置集進行分組,用於區分 Data ID 相同的配置集。默認採用 DEFAULT_GROUP 。配置分組的常見場景:不一樣的應用或組件使用了相同的配置類型,如 database_url 配置和 消息隊列 Topic 配置等。
要使用 Nacos 進行配置管理,首先須要啓動 Nacos 服務端,而後客戶端接入,關於 Nacos 的服務端啓動具體操做能夠參見 Java微服務新生代之Nacos 。
啓動了 Nacos 服務端,首先咱們在 Nacos 控制檯上的配置管理裏新建一個最簡單的配置,如圖:
保存成功後能列表裏看下建立的配置記錄以下:
每一個配置集的操做欄都提供了配置的查看修改和清除功能,還有額外的示例代碼查看,來引導咱們如何在客戶端使用 Nacos 讀取該配置集,目前只支持 Java,Spring Boot,Spring Cloud,其餘語言的版本還在完善語言。
接下里看下Nacos 基於 Spring 技術棧的集成方式首先給 Spring 程序添加依賴
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId>
<version>0.2.3-RC1</version>
</dependency>
複製代碼
最新版本能夠在 maven 倉庫 mvnrepository.com 中獲取。
添加 @EnableNacosConfig
註解啓用 Nacos Spring 的配置管理服務。以下示例,咱們使用了 @NacosPropertySource
註解加載了咱們先前建立的配置集,而且指定爲自動刷新配置。
經過 Nacos 的 @NacosValue
註解將配置項與屬性進行綁定。
啓動程序後,打開 http://localhost:8080/config/hello
獲取返回結果hello,test
,內容以下就表示讀取配置成功。
讀取成功後咱們再嘗試修改這個配置項驗證下 Nacos 的配置信息的動態刷新特性。修改有兩種方式,一種在 Nacos 控制檯上手動修改,另外一種在命令行使用提供的 API 直接進行修改:
curl -X POST "http://127.0.0.1:8848/nacos/v1.0.1/cs/configs?dataId=com.one.learn.nacos.config&group=DEFAULT_GROUP&content=message=nacos-spring"
複製代碼
再次訪問 http://localhost:8080/config/hello
,此時返回內容爲hello,nacos-spring
,返回信息變化說明程序中的message
值已經被動態更新了。
添加配置動態變動的依賴:
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.1</version>
</dependency>
複製代碼
注意: 這裏的版本 0.2.x.RELEASE 對應的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 對應的是 Spring Boot 1.x 版本。
在 application.properties
中配置 Nacos Server 的地址:
nacos.config.server-addr=127.0.0.1:8848
複製代碼
使用 @NacosPropertySource
加載 dataId
爲 com.one.learn.nacos.config
的配置源,並開啓自動更新:
經過 Nacos 的 @NacosValue
註解設置屬性值,與集成 Spring 的步驟內容同樣。
啓動引導類,打開 http://localhost:8080/config/hello
獲取返回結果hello,nacos
, 說明程序中的配置已經讀取成功。
若是使用 Spring Cloud 程序,Nacos 提供了依賴庫 spring-cloud-starter-alibaba-nacos-config
實現配置的動態變動。
添加依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
複製代碼
注意:版本 0.2.x.RELEASE 對應的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 對應的是 Spring Boot 1.x 版本。
在 bootstrap.properties
中配置 Nacos server 的地址和應用名以下,在 Nacos Spring Cloud 中,dataId
默認爲 spring.application.name
加上 properties
文件後綴,因此,爲了能正確讀取配置,咱們須要將 Nacos 上配置集 ID 爲 com.one.learn.nacos.config
調整爲 com.one.learn.nacos.config.properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=com.one.learn.nacos.config
複製代碼
這裏使用 bootstrap.properties 做爲配置 Nacos 地方,是由於 Spring Boot 配置文件的加載順序,依次爲 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,在 application
層級上配置 Nacos 時沒法生效。
注意:當使用域名的方式來訪問 Nacos 時,
spring.cloud.nacos.config.server-addr
配置的方式必須爲域名:port
。 即便使用域名,端口不能省略。例如 Nacos 的域名爲 abc.com.nacos,監聽的端口爲 80,則spring.cloud.nacos.config.server-addr=abc.com.nacos:80
。
經過 Spring Cloud 原生註解 @RefreshScope
實現配置自動更新:
運行程序,訪問 http://localhost:8080/config/hello
,返回內容爲 hello,nacos
,則表示配置讀取成功。
在 Nacos 控制檯修改配置項 message=Nacos Spring Cloud
,再次訪問 http://localhost:8080/config/hello
, 返回內容爲 hello,Nacos Spring Cloud
,說明程序中的message
值已經被動態更新了。
上面實現了Nacos基本的配置讀取和更新後,接下來咱們看下 Nacos 如何進行多環境配置的管理,須要注意的是此特性僅針對於 Spring Cloud 應用。
假設咱們程序有兩個環境:測試,生產環境須要管理配置,在 Spring Boot 程序中,默認的配置文件爲 application.properties,傳統的方式是,利用 Spring Profile 特性,在項目裏存放多個環境對應的配置文件,文件格式爲 application-${env}-properties
,而且須要用 spring.profile.active
指定啓動時應用哪一個環境的配置。
Nacos Config 主要經過 dataId 和 group 來惟一肯定一條配置,在 Nacos Spring Cloud 中,dataId
的完整格式以下:
${prefix}-${spring.profile.active}.${file-extension}
複製代碼
prefix
默認爲 spring.application.name
的值,也能夠經過配置項 spring.cloud.nacos.config.prefix
來配置。
spring.profile.active
即爲當前環境對應的 profile,詳情能夠參考 Spring Boot文檔。
注意:當 spring.profile.active 爲空時,對應的鏈接符 - 也將不存在,dataId 的拼接格式變成 {prefix}.{file-extension}
file-exetension
爲配置內容的數據格式,能夠經過配置項 spring.cloud.nacos.config.file-extension
來配置。目前只支持 properties
和 yaml
類型。
group 默認爲 DEFAULT_GROUP
,能夠經過 spring.cloud.nacos.config.group
自定義指定名稱。
都存放兩個配置項,以 property
文件格式存儲。
#nacos-config-prod.properties
server.port=8091
message=nacos-config-prod
#nacos-config-test.properties
server.port=8081
message=nacos-config-test
複製代碼
application.properties
中配置以下:spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=nacos-config
spring.cloud.nacos.config.file-extension=properties
spring.profile.active=test
複製代碼
編寫測試控制器類 ConfigController,將配置項與屬性值進行綁定。
啓動程序,能夠看到以下數據結果,說明測試環境下端口配置已經生效。
再經過瀏覽器訪問 http://localhost:8081/config/hello
,返回 hello,nacos-config-test
。
修改配置文件 application.properties
的 spring.profile.active
,從新啓動程序並訪問 http://localhost:8091/config/hello
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=nacos-config
spring.cloud.nacos.config.file-extension=properties
spring.profile.active=prod
複製代碼
能獲取到返回結果 hello,nacos-config-prod
, 也說明程序另外一個環境的配置切換成功。
除了主動檢驗配置生效以外,咱們能夠經過添加監聽器的方式來監聽配置的變化,實現很簡單,使用 @NacosConfigListener
便可,一旦指定的配置集 ID 對應配置發生了變化,監聽器就會受到回調,將全部的配置信息以字符串形式返回。
當存在多個配置項時,回調接收到的配置字符串中帶有換行格式,須要本身處理。
固然 @NacosConfigListener
也支持類型轉換,好比轉換爲 Properties 對象
Nacos 裏 Namespace 做爲租戶顆粒度細分而存在,主要爲了解決多環境以及多租戶數據(配置和服務)隔離的問題。
若是隻是一個租戶(用戶),不一樣的 namespce 能夠對應不一樣的環境,以此實現環境配置的隔離,效果就跟上節內容:Nacos 多環境配置管理 類似。
若是存在多個租戶,爲每一個租戶分配不一樣的 namespace,這樣每一個租戶(用戶)的配置數據以及註冊的服務數據都會歸屬到本身的 namespace 下,就能夠實現多租戶配置數據隔離做用。
注意:Nacos 目前還沒實現帳號權限的分配和隔離,沒法讓各租戶本身管理本身的配置,這一塊功能仍在規劃中。
簡單介紹以後,再來看下 namespace 相關的最佳實踐:
在 nacos 的控制檯左邊功能側看到有一個 命名空間 的功能,點擊就能夠看到 新建命名空間 的按鈕,那麼這個時候就能夠建立本身的命名空間了。建立成功以後,會生成一個命名空間ID,主要是用來避免命名空間名稱有可能會出現重名的狀況。所以當您在應用中須要配置指定的 namespace 時,填入的是命名空間ID。
在沒有明確指定 ${spring.cloud.nacos.config.namespace}
配置的狀況下, 默認使用的是 Nacos 上 Public 這個namespae。若是須要使用自定義的命名空間,能夠經過如下配置來實現:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
複製代碼
該配置必須放在 bootstrap.properties 文件中。此外
spring.cloud.nacos.config.namespace
的值是 namespace 對應的 id。
到這裏,到這裏關於 Nacos 管理配置的學習就告一段落,固然在配置管理上還有更多的用法,Nacos 官方文檔描述的也很詳細,你們也能夠多在官網上查閱。後續我將繼續深刻研究其餘 Spring Cloud Alibaba 微服務生態的組件,歡迎感興趣的小夥伴能夠關注個人微信公衆號,每週一更。
示例項目:nacos-actions:github.com/wrcj12138aa…
環境支持:
- JDK 8
- Maven 3.6.0
- SpringBoot 2.1.0.RELEASE
- SpringCloud Greenwich.RELEASE
- SpringCloudAlibaba 0.9.0.RELEASE