Java微服務新生代Nacos-配置管理

前言

在上文 Java微服務新生代之Nacos 已經介紹了微服務框架 Nacos 以及它在服務註冊與發現的功能,本文將主要介紹它的另外一強大功能:配置管理,學習利用 Nacos 如何實現經過統一的管理界面,集中化實現分佈式服務的配置維護和實時更新。html

本文主要內容涉及以下:git

  • Nacos配置管理概念介紹
  • 如何 Nacos 管理配置
  • Nacos 多環境配置管理

介紹Nacos配置管理

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 服務端,而後客戶端接入,關於 Nacos 的服務端啓動具體操做能夠參見 Java微服務新生代之Nacos

啓動了 Nacos 服務端,首先咱們在 Nacos 控制檯上的配置管理裏新建一個最簡單的配置,如圖:

image-20190623141751675

保存成功後能列表裏看下建立的配置記錄以下:

image-20190623141953948

每一個配置集的操做欄都提供了配置的查看修改和清除功能,還有額外的示例代碼查看,來引導咱們如何在客戶端使用 Nacos 讀取該配置集,目前只支持 Java,Spring Boot,Spring Cloud,其餘語言的版本還在完善語言。

image-20190623142049041
接下里看下Nacos 基於 Spring 技術棧的集成方式

Nacos Spring

  1. 首先給 Spring 程序添加依賴

    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-spring-context</artifactId>
        <version>0.2.3-RC1</version>
    </dependency>
    複製代碼

    最新版本能夠在 maven 倉庫 mvnrepository.com 中獲取。

  2. 添加 @EnableNacosConfig 註解啓用 Nacos Spring 的配置管理服務。以下示例,咱們使用了 @NacosPropertySource 註解加載了咱們先前建立的配置集,而且指定爲自動刷新配置。

  3. 經過 Nacos 的 @NacosValue 註解將配置項與屬性進行綁定。

  1. 啓動程序後,打開 http://localhost:8080/config/hello 獲取返回結果hello,test,內容以下就表示讀取配置成功。

  2. 讀取成功後咱們再嘗試修改這個配置項驗證下 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"
    複製代碼
  3. 再次訪問 http://localhost:8080/config/hello,此時返回內容爲hello,nacos-spring,返回信息變化說明程序中的message值已經被動態更新了。

Nacos Spring Boot

  1. 添加配置動態變動的依賴:

    <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 版本。

  2. application.properties 中配置 Nacos Server 的地址:

nacos.config.server-addr=127.0.0.1:8848
複製代碼
  1. 使用 @NacosPropertySource 加載 dataIdcom.one.learn.nacos.config 的配置源,並開啓自動更新:

  2. 經過 Nacos 的 @NacosValue 註解設置屬性值,與集成 Spring 的步驟內容同樣。

  3. 啓動引導類,打開 http://localhost:8080/config/hello 獲取返回結果hello,nacos, 說明程序中的配置已經讀取成功。

Nacos Spring Cloud

若是使用 Spring Cloud 程序,Nacos 提供了依賴庫 spring-cloud-starter-alibaba-nacos-config 實現配置的動態變動。

  1. 添加依賴:

    <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 版本。

  2. 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

  3. 經過 Spring Cloud 原生註解 @RefreshScope 實現配置自動更新:

  4. 運行程序,訪問 http://localhost:8080/config/hello ,返回內容爲 hello,nacos ,則表示配置讀取成功。

  5. 在 Nacos 控制檯修改配置項 message=Nacos Spring Cloud,再次訪問 http://localhost:8080/config/hello , 返回內容爲 hello,Nacos Spring Cloud,說明程序中的message值已經被動態更新了。

Nacos 多環境配置管理

上面實現了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 來配置。目前只支持 propertiesyaml 類型。

group 默認爲 DEFAULT_GROUP,能夠經過 spring.cloud.nacos.config.group 自定義指定名稱。

  1. 基於上面的配置規則描述,咱們能夠先在 Nacos 控制檯上新建兩個不一樣環境的配置集,以下

image-20190623171248544

都存放兩個配置項,以 property 文件格式存儲。

#nacos-config-prod.properties
server.port=8091
message=nacos-config-prod

#nacos-config-test.properties
server.port=8081
message=nacos-config-test
複製代碼
  1. 而後在程序的主配置文件 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
複製代碼
  1. 編寫測試控制器類 ConfigController,將配置項與屬性值進行綁定。

  2. 啓動程序,能夠看到以下數據結果,說明測試環境下端口配置已經生效。

    再經過瀏覽器訪問 http://localhost:8081/config/hello,返回 hello,nacos-config-test

  3. 修改配置文件 application.propertiesspring.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 對象

Namespace 最佳實踐

Nacos 裏 Namespace 做爲租戶顆粒度細分而存在,主要爲了解決多環境以及多租戶數據(配置和服務)隔離的問題。

  • 若是隻是一個租戶(用戶),不一樣的 namespce 能夠對應不一樣的環境,以此實現環境配置的隔離,效果就跟上節內容:Nacos 多環境配置管理 類似。

    img

  • 若是存在多個租戶,爲每一個租戶分配不一樣的 namespace,這樣每一個租戶(用戶)的配置數據以及註冊的服務數據都會歸屬到本身的 namespace 下,就能夠實現多租戶配置數據隔離做用。

    img

    注意:Nacos 目前還沒實現帳號權限的分配和隔離,沒法讓各租戶本身管理本身的配置,這一塊功能仍在規劃中。

簡單介紹以後,再來看下 namespace 相關的最佳實踐:

  • 如何來獲取 namespace 的值。
  • namespace 參數初始化方式。

建立命名空間

在 nacos 的控制檯左邊功能側看到有一個 命名空間 的功能,點擊就能夠看到 新建命名空間 的按鈕,那麼這個時候就能夠建立本身的命名空間了。建立成功以後,會生成一個命名空間ID,主要是用來避免命名空間名稱有可能會出現重名的狀況。所以當您在應用中須要配置指定的 namespace 時,填入的是命名空間ID

image-20190623180238812

關聯命令空間

在沒有明確指定 ${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-actionsgithub.com/wrcj12138aa…

環境支持:

  • JDK 8
  • Maven 3.6.0
  • SpringBoot 2.1.0.RELEASE
  • SpringCloud Greenwich.RELEASE
  • SpringCloudAlibaba 0.9.0.RELEASE

參考

相關文章
相關標籤/搜索