目前業界流行的統一配置管理中心組件有Spring Cloud Config、Spring Cloud Alibaba的Nacos及攜程開源的Apollo,本文將介紹Nacos做爲統一配置管理中心的使用。spring
好比我如今有這樣一段代碼:bootstrap
@Value("${your.configuration}") private String yourConfiguration; @GetMapping("/test_configuration") public String testConfiguration(){ return yourConfiguration; }
這段代碼讀取了一個配置項,常規的配置方式應該配置於項目的application.yaml或者.properties文件中,那麼使用Nacos要如何管理這段配置呢?app
首先,添加依賴ide
<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是配置文件的格式,對應關係以下:
spa
到目前爲止,咱們就已經爲項目整合了Nacos的配置管理功能,並在Nacos Server上新建了項目所需的配置。啓動項目,訪問/test_configuration接口,返回結果以下則表明整合成功:
3d
在實際的應用開發中,咱們一般但願在配置中心上修改了配置項後,不須要重啓項目就可以實現實時的動態配置刷新。對於整合了Nacos的微服務項目來講,想要實現這個功能是很簡單的,只須要在讀取了配置屬性的類上加上@RefreshScope註解便可。
日誌
添加完該註解後,重啓項目,而後到Nacos上修改以前配置項的值,點擊發布後會有一個內容比較的提示:
code
點擊確認發佈後,而後再訪問/test_configuration接口,返回的就是修改後的值了,而此時咱們並無重啓項目:
咱們能夠在Nacos控制檯-配置管理-歷史版本中查詢指定配置的歷史版本,Data ID和Group必填,點擊查詢能夠看見全部的歷史版本:
點擊「回滾」則能夠回滾到指定的歷史版本。須要注意的是當選擇回滾的版本是最第一版本時就會觸發一個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提供了兩種方式能夠實現不一樣應用之間的配置共享
首先須要到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; }
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