1. 程式人生 > >Nacos(七):Nacos共享配置

Nacos(七):Nacos共享配置

前言

本文參考文章:
SpringCloud Alibaba - Nacos Config 自定義共享配置

前景回顧:

  • Nacos(六):多環境下如何“管理”及“隔離”配置和服務
  • Nacos(五):多環境下如何“讀取”Nacos中相應環境的配置
  • Nacos(四):SpringCloud專案中接入Nacos作為配置中心

前幾章已經基本介紹了springcloud專案結合Nacos的大部分用法,本文介紹一下Nacos作為配置中心時,如何讀取共享配置

我的環境

  • Windows10
  • JDK8
  • SpringCloud:Finchley.RELEASE
  • SpringBoot:2.0.4.RELEASE
  • spring-cloud-alibaba-dependencies:0.2.2.RELEASE
  • Nacos-server:1.0.1

本文的專案Demo繼續沿用之前文章中的聚合工程Nacos,若小夥伴還沒有之前的環境,可至原始碼地址中下載

場景描述

一個專案中服務數量增加後,配置檔案相應增加,多個配置檔案中會存在相同的配置,那麼我們可以將相同的配置獨立出來,作為該專案中各個服務的共享配置檔案,每個服務都可以通過Nacos進行共享配置的讀取

下面用一個demo演示下,是否可行

  • demo工程:nacos-config-share
  • 配置檔案:nacos-config-share.yml
  • 共享配置檔案:shareconfig1.yml,shareconfig2.yml

建立專案

一如往常,還是在聚合工程Nacos下建立名為nacos-config-share

的子工程,其pom.xml檔案依賴與之前的專案都一致,如果您沒有之前的專案可參考原始碼地址

1、修改springboot啟動類NacosConfigShareApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RefreshScope
public class NacosConfigShareApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigShareApplication.class, args);
    }

    @Value("${nacos.share}")
    private String share;


    @Value("${share.config1}")
    private String shareConfig1;

    @Value("${share.config2}")
    private String shareConfig2;

    @RequestMapping("/getValue")
    public String getValue() {
        return share;
    }

    @RequestMapping("/getShare1")
    public String getShare1() {
        return shareConfig1;
    }

    @RequestMapping("/getShare2")
    public String getShare2() {
        return shareConfig2;
    }
}

2、修改該專案的配置檔案bootstrap.yml

spring:
  application:
    name: nacos-config-share
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
        shared-dataids: shareconfig1.yml,shareconfig2.yml
        refreshable-dataids: shareconfig1.yml,shareconfig2.yml

從配置檔案可以看出,通過shared-dataids屬性來指定要讀取共享配置檔案的DataID,多個檔案用,分隔
使用refreshable-dataids指定共享配置檔案支援自動重新整理

新建配置檔案

這裡我們作為演示,暫不加入Namespace,直接在公共空間中建立及測試

建立配置檔案nacos-config-share.yml,詳細如下:

  • DataId:nacos-config-share.yml
  • 配置格式:YAML
  • 配置內容:
    server: port: 9984 nacos: share: nacos-config-share

建立共享配置檔案1shareconfig1.yml,詳細如下:

  • DataId:shareconfig1.yml
  • 配置格式:YAML
  • 配置內容:
    share: config1: 這裡是共享配置檔案1

建立共享配置檔案1shareconfig2.yml,詳細如下:

  • DataId:shareconfig2.yml
  • 配置格式:YAML
  • 配置內容:
    share: config2: 這裡是共享配置檔案2

建立成功後,配置列表如下圖:

啟動測試

直接啟動專案,如果啟動成功。可以看到日誌中如下資訊:

訪問啟動類中提供的介面,測試下能否獲取到共享配置檔案中的值

訪問127.0.0.1:9984/getValue,返回:nacos-config-share
訪問127.0.0.1:9984/getShare1,返回:這裡是共享配置檔案1
訪問127.0.0.1:9984/getShare2,返回:這裡是共享配置檔案2

再測試下refreshable-dataids配置的自動重新整理是否生效

在Nacos控制檯中修改共享配置檔案shareconfig2.yml的值為:這裡是共享配置檔案2這裡是共享配置檔案2

編輯儲存後,重新請求 127.0.0.1:9984/getShare2 ,觀察返回結果如下:

這裡是共享配置檔案2這裡是共享配置檔案2

以上返回結果說明通過在配置檔案中指定shared-dataidsrefreshable-dataids是可以實現共享配置檔案的讀取和自動重新整理的。

需求變更

假設現在要讀取shareconfig3.ymlshareconfig4.yml檔案但是它的Group為SHARE3_GROUPSHARE4_GROUP, 即共享配置檔案與專案自身配置檔案不在同一Group中(上邊的例子是全都在DEFAULT_GROUP分組) 那如果繼續用上邊的方法,就無法讀取共享配置檔案

這時可以使用另一個配置ext-config,它可以由使用者自定義指定需要載入的配置DataID、Group以及是否自動重新整理

並且ext-config是一個集合(List),支援多個配置檔案的指定。

新建共享配置檔案

先建立配置配置檔案shareconfig3.ymlshareconfig4.yml,注意他們的Group屬性

  • DataId:shareconfig3.yml
  • Group:SHARE3_GROUP
  • 配置格式:YAML
  • 配置內容:
    share: config3: 這裡是共享配置檔案3,Group:SHARE3_GROUP
  • DataId:shareconfig4.yml
  • Group:SHARE4_GROUP
  • 配置格式:YAML
  • 配置內容:
    share: config4: 這裡是共享配置檔案4,Group:SHARE4_GROUP

建立成功頁面如下:

修改專案程式碼

1、在啟動類NacosConfigShareApplication.java中新增如下程式碼

    @Value("${share.config3}")
    private String shareConfig3;

    @Value("${share.config4}")
    private String shareConfig4;


    @RequestMapping("/getShare3")
    public String getShare3() {
        return shareConfig3;
    }

    @RequestMapping("/getShare4")
    public String getShare4() {
        return shareConfig4;
    }

2、修改專案配置檔案bootstrap.yml,增加ext-config配置

spring:
  application:
    name: nacos-config-share
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        prefix: ${spring.application.name}
        file-extension: yml
        shared-dataids: shareconfig1.yml,shareconfig2.yml
        refreshable-dataids: shareconfig1.yml,shareconfig2.yml
        ext-config:
          - data-id: shareconfig3.yml
            group: SHARE3_GROUP
            refresh: true
          - data-id: shareconfig4.yml
            group: SHARE4_GROUP
            refresh: true

啟動進行測試

專案經過修改後,可以看到

  1. 專案自身的nacos配置檔案屬於DEFAULT_GROUP下,預設讀取
  2. shareconfig1.yml,shareconfig2.yml 都屬於DEFAULT_GROUP下,通過shared-dataids指定進行讀取
  3. shareconfig3.yml,shareconfig4.yml 都屬於非DEFAULT_GROUP下,通過ext-config配置屬性進行自定義讀取

啟動專案,測試所有的配置檔案是否可以正常讀取

訪問127.0.0.1:9984/getValue,返回:nacos-config-share
訪問127.0.0.1:9984/getShare1,返回:這裡是共享配置檔案1
訪問127.0.0.1:9984/getShare2,返回:這裡是共享配置檔案2這裡是共享配置檔案2
訪問127.0.0.1:9984/getShare3,返回:這裡是共享配置檔案3,Group:SHARE3_GROUP
訪問127.0.0.1:9984/getShare4,返回:這裡是共享配置檔案4,Group:SHARE4_GROUP

修改shareconfig4.yml的配置內容為:這裡是共享配置檔案4,Group:SHARE4_GROUP,支援自動重新整理,儲存後,再次呼叫127.0.0.1:9984/getShare4,返回如下:

這裡是共享配置檔案4,Group:SHARE4_GROUP,支援自動重新整理

呼叫介面後發現,兩種共享配置的載入方式都可以正常讀取,並且可以一起使用。ext-config的方式實現了使用者自定義配置共享配置檔案。

總結

上面的demo已經演示Nacos共享配置的兩種實現方式,兩種方式針對不同的場景,總結如下:

  • shared-dataids方式:
    • 適合於共享配置檔案與專案預設配置檔案處於相同Group時,直接兩條命令就可以搞定
    • 優點:配置方便
    • 缺點:只能在同一Group中
  • ext-config方式:
    • 它可以由開發者自定義要讀取的共享配置檔案的DataId、Group、refresh屬性,這樣剛好解決了shared-dataids存在的侷限性。
    • 優點:可以與shared-dataids方案結合使用,使用者自定義配置。靈活性強
    • 缺點:配置容易出錯,要熟悉YAML語法

可見兩種方式各有長處,所以如果在開發中需要使用共享配置,大家可以是具體情況而定選擇自己最合適的方案。

本文原始碼:https://github.com/larscheng/larscheng-learning-demo/tree/master/Nacos


  • 文章作者: LarsCheng
  • 文章連結: 本文首發於個人部落格:https://www.larscheng.com/nacos-namespace/
  • 釋出方式:OpenWrite 最懂你的科技自媒體管理平臺
  • 版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 LarsCheng's Blog!