Spring Cloud Alibaba學習筆記(22) - Nacos配置管理


目前業界流行的統一配置管理中心組件有Spring Cloud Config、Spring Cloud Alibaba的Nacos及攜程開源的Apollo,本文將介紹Nacos作為統一配置管理中心的使用。

使用Nacos管理配置

比如我現在有這樣一段代碼:

@Value("${your.configuration}")
private String yourConfiguration;

@GetMapping("/test_configuration")
public String testConfiguration(){
    return yourConfiguration;
}

這段代碼讀取了一個配置項,常規的配置方式應該配置於項目的application.yaml或者.properties文件中,那么使用Nacos要如何管理這段配置呢?

首先,添加依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

然后在resources目錄下新建一個名為bootstrap.yml的文件,添加配置項:

spring:
  application:
    name: study01
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 888ac051-ae5f-44f1-940a-30c7824a0e91
        cluster-name: HZ
        file-extension: yaml
  profiles:
    active: dev

打開Nacos控制台-配置管理-配置列表,點擊+號新建配置,詳情如下。

注意,這里的Data ID是具有一定格式的,需要與項目中的配置對應上。如上圖中的:study01-dev.yaml,其中study01是微服務名稱,dev是環境,yaml是配置文件的格式,對應關系如下:

到目前為止,我們就已經為項目整合了Nacos的配置管理功能,並在Nacos Server上新建了項目所需的配置。啟動項目,訪問/test_configuration接口,返回結果如下則代表整合成功:

動態刷新配置及回滾

動態刷新配置

在實際的應用開發中,我們通常希望在配置中心上修改了配置項后,不需要重啟項目就能夠實現實時的動態配置刷新。對於整合了Nacos的微服務項目來說,想要實現這個功能是很簡單的,只需要在讀取了配置屬性的類上加上@RefreshScope注解即可。

添加完該注解后,重啟項目,然后到Nacos上修改之前配置項的值,點擊發布后會有一個內容比較的提示:

點擊確認發布后,然后再訪問/test_configuration接口,返回的就是修改后的值了,而此時我們並沒有重啟項目:

回滾

我們可以在Nacos控制台-配置管理-歷史版本中查詢指定配置的歷史版本,Data IDGroup必填,點擊查詢可以看見所有的歷史版本:

點擊“回滾”則可以回滾到指定的歷史版本。需要注意的是當選擇回滾的版本是最初版本時就會觸發一個Bug,回滾失敗,配置丟失,官方稱會在1.2版本中修復該問題。只要回滾的不是初始版本則不會觸發這個bug,回滾其他版本是可以正常使用的,所以該問題注意一下即可規避。

配置共享

不同環境之間的配置共享

想要實現配置共享只需要新建一個配置文件即可,首先我們來看一段日志信息,當我們啟動項目時,控制台會出輸出如下一段日志信息:

2019-10-29 09:35:17.986  INFO 9104 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='study01-dev.yaml'}, NacosPropertySource {name='study01.yaml'}]}

該日志信息可以看到,項目在啟動時會到Nacos上讀取兩個配置文件,即study01-dev.yaml和study01.yaml,其中study01-dev.yaml里保存的是開發環境下特定的配置,而study01.yaml里保存的則是所有環境下通用的配置。項目在啟動時具體讀取哪個環境的配置文件是由bootstrap.yml文件中的spring.profiles.active配置項所決定的。
既然我們知道保存在content-center.yaml里的配置項會在所有環境中共享,那么只需要到Nacos上新建這個配置文件即可,配置方法同上。
PS:特定環境下的配置優先級高於通用環境配置,例如${your.configuration}配置項同時存在於content-center-dev.yaml和content-center.yaml中,若spring.profiles.active的值為dev,那么讀取的將是content-center-dev.yaml里所配置的值。

不同應用之間的配置共享

目前Nacos提供了兩種方式可以實現不同應用之間的配置共享

使用shared-dataids

實現

首先需要到Nacos上創建一些共享配置

修改項目中的bootstrap.yml文件如下

spring:
  application:
    name: study01
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 888ac051-ae5f-44f1-940a-30c7824a0e91
        cluster-name: HZ
        file-extension: yaml
        # 共享配置的DataId,多個使用,分隔
        # 越靠后,優先級越高
        # .yaml后綴不能少,只支持yaml/properties
        shared-dataids: common1.yaml,common2.yaml
        # 哪些共享配置支持動態刷新,多個使用,分隔
        refreshable-dataids: common1.yaml
  profiles:
    active: dev

從以上的配置示例可以看出,其實shared-dataids的主要作用就是用來指定共享配置的Data ID,使得該微服務可以讀取這些共享配置。同理,其他微服務若想讀取這些共享配置,只需在項目的bootstrap.yml文件中添加相應的shared-dataids配置即可,如此一來就實現了多個微服務之間的配置共享。

測試代碼

@Value("${common1.configuration1}")
private String common1Configuration;

@Value("${common2.configuration2}")
private String common2Configuration;

@GetMapping("/test_common_configuration1")
public String testCommonConfiguration1() {
    return common1Configuration;
}

@GetMapping("/test_common_configuration2")
public String testCommonConfiguration2() {
    return common2Configuration;
}

測試結果

使用ext-config

實現

spring:
  application:
    name: study01
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        ext-config:
          # 需共享的DataId,yaml后綴不能少,目前只支持yaml/properties
          # 越靠后,優先級越高 優先級common2.yaml > common1.yaml
          - data-id: common1.yaml
            # common1.yaml所在的group
            group: DEFAULT_GROUP
            # 是否允許刷新,默認false
            refresh: true
          - data-id: common2.yaml
            group: DEFAULT_GROUP
            refresh: true
  profiles:
    active: dev

ext-config提供了較為細化的配置方式,並且可以指定配置組。到目前為止,我們介紹了三種從Nacos上讀取配置的方式,其優先級如下:

  • shared-dataids < ext-config < 自動

除此之外,當存在相同的遠程配置和本地配置時,遠程配置優先級要高於本地配置文件。但可以通過添加如下配置調整,需要注意的是這段配置需要放在遠程配置才會生效:

spring:
  cloud:
    config:
      # 是否允許本地配置覆蓋遠程配置,默認true
      allow-override: true
      # 是否一切以本地配置為准,默認false
      override-none: false
      # 系統環境變量或系統屬性才能覆蓋遠程配置文件的配置
      # 本地配置文件中配置的優先級低於遠程配置,默認true
      override-system-properties: true


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM