SpringCloudAlibaba之配置管理組件-Nacos

[TOC]

目前成都創(chuàng)新互聯(lián)公司已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、東源網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。


使用Nacos管理配置

為什么要需要配置管理?

在微服務(wù)架構(gòu)中,每個(gè)微服務(wù)都有可能會存在多個(gè)實(shí)例,為了保證同一微服務(wù)不同實(shí)例的配置文件內(nèi)容一致,我們就需要有一個(gè)服務(wù)可以對微服務(wù)項(xiàng)目的配置文件進(jìn)行統(tǒng)一管理,通常我們將其稱之為統(tǒng)一配置管理中心。因?yàn)槿绻渲梦募膬?nèi)容不一致,有可能會導(dǎo)致同一微服務(wù)的不同實(shí)例在行為上發(fā)生差異,從而導(dǎo)致一些錯(cuò)誤。

除此之外,在企業(yè)開發(fā)中還要求項(xiàng)目在不同環(huán)境使用不同配置,以及可以在不重啟服務(wù)的情況下實(shí)現(xiàn)配置文件的動態(tài)刷新,為了實(shí)現(xiàn)這些需求我們也得使用到統(tǒng)一配置管理中心

目前業(yè)界比較流行的統(tǒng)一配置管理中心組件有Spring Cloud的Config、Spring Cloud Alibaba的Nacos以及攜程開源的Apollo。本文主要介紹Nacos作為統(tǒng)一配置管理中心的使用,關(guān)于其他配置中心組件以及Nacos的基本使用可以參考如下文章:

  • Spring Cloud Config - 統(tǒng)一配置中心
  • Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos

接下來,我們看看如何使用Nacos管理配置文件,現(xiàn)在我有一段接口代碼如下:

@RestController
@RequiredArgsConstructor
public class TestController {

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

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

這段代碼讀取了一個(gè)配置項(xiàng),此時(shí)該配置項(xiàng)存在于項(xiàng)目的application.yml文件中,如下:

your:
  configuration: your_value

那么我們要如何使用Nacos管理這段配置呢?首先需要為項(xiàng)目整合Nacos配置管理的功能,在pom.xml文件中添加如下依賴:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • Tips:該項(xiàng)目使用的Spring Cloud版本為Greenwich.SR1,Alibaba的版本為2.1.0.RELEASE

然后在resources目錄下新建一個(gè)名為bootstrap.yml的文件,添加如下配置項(xiàng):

spring:
  cloud:
    nacos:
      config:
        # 指定作為配置中心的nacos server地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yaml
      discovery:
        # 指定作為服務(wù)注冊中心的nacos server地址
        server-addr: 127.0.0.1:8848
  application:
    name: content-center
  profiles:
    active: dev

到Nacos的管理頁面的“配置列表”中新建配置:
Spring Cloud Alibaba之配置管理組件 - Nacos

新建的配置內(nèi)容如下圖:
Spring Cloud Alibaba之配置管理組件 - Nacos

注意,這里的Data ID是具有一定格式的,需要與項(xiàng)目中的配置對應(yīng)上。如上圖中的:content-center-dev.yaml,其中content-center是微服務(wù)名稱,dev是環(huán)境,yaml是配置文件的格式。這里簡單整理成了一張對照圖,如下:
Spring Cloud Alibaba之配置管理組件 - Nacos

  • Tips:這里文件Data ID的后綴不一定必須是.yaml,也可以是.yml,因?yàn)檫@兩種后綴其實(shí)都是表示同一種文件格式

到目前為止,我們就已經(jīng)為項(xiàng)目整合了Nacos的配置管理功能,并在Nacos Server上新建了項(xiàng)目所需的配置。此時(shí)就可以將之前配置在application.yml文件中的配置項(xiàng)給刪除掉。然后啟動項(xiàng)目,訪問/getConfiguration接口,返回結(jié)果如下則代表整合成功:
Spring Cloud Alibaba之配置管理組件 - Nacos


動態(tài)刷新配置及回滾

在實(shí)際的企業(yè)開發(fā)中,我們通常希望在配置中心上修改了配置項(xiàng)后,不需要重啟項(xiàng)目就能夠?qū)崿F(xiàn)實(shí)時(shí)的動態(tài)配置刷新。對于整合了Nacos的微服務(wù)項(xiàng)目來說,想要實(shí)現(xiàn)這個(gè)功能是很簡單的,只需要在讀取了配置屬性的類上加上@RefreshScope注解即可。如下示例:

// 該注解用于標(biāo)識哪些地方需要動態(tài)刷新配置,可以寫在類及方法上
@RefreshScope
@RestController
@RequiredArgsConstructor
public class TestController {

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

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

添加完該注解后,重啟項(xiàng)目,然后到Nacos上修改之前配置項(xiàng)的值,點(diǎn)擊發(fā)布后會有一個(gè)內(nèi)容比較的提示,可以看到我將之前的your_value改成了my_value
Spring Cloud Alibaba之配置管理組件 - Nacos

點(diǎn)擊確認(rèn)發(fā)布后,然后再訪問/getConfiguration接口,返回的就是修改后的值了,而此時(shí)我們并沒有重啟項(xiàng)目:
Spring Cloud Alibaba之配置管理組件 - Nacos

除了以上所介紹的動態(tài)刷新之外,還有一個(gè)比較重要的功能:配置回滾。如果有一天修改某些配置項(xiàng)并發(fā)布后發(fā)現(xiàn)手滑改錯(cuò)了,導(dǎo)致項(xiàng)目運(yùn)行出問題,那么就可以使用回滾功能可以幫助我快速回滾到某個(gè)特定的版本上。我們可以在Nacos的“歷史版本”頁面中查詢指定配置的歷史版本,如下圖:
Spring Cloud Alibaba之配置管理組件 - Nacos

點(diǎn)擊“詳情”可以查看到具體的配置內(nèi)容:
Spring Cloud Alibaba之配置管理組件 - Nacos

點(diǎn)擊“回滾配置”則可以回滾到指定的歷史版本,例如我這里就回滾到初始版本:
Spring Cloud Alibaba之配置管理組件 - Nacos

提示回滾成功后訪問/getConfiguration接口,會發(fā)現(xiàn)報(bào)錯(cuò)了:
Spring Cloud Alibaba之配置管理組件 - Nacos

這是目前Nacos 1.1版本的一個(gè)Bug,當(dāng)選擇回滾的版本是最初版本時(shí)就會發(fā)生這個(gè)問題。官方稱會在1.2版本中修復(fù)該問題,而我目前使用的是最新的1.1.3版本,仍屬于1.1版本(2019-09-10),所以該bug還存在。相關(guān)的issues如下:

  • https://github.com/alibaba/nacos/issues/186
  • https://github.com/alibaba/nacos/issues/434

在1.1版本下,只要回滾的不是初始版本則不會觸發(fā)這個(gè)bug,回滾其他版本是可以正常使用的,所以該問題注意一下即可規(guī)避

注:觸發(fā)該bug后,配置內(nèi)容由于回滾失敗會丟失,此時(shí)需要重新創(chuàng)建配置


配置共享

以上我們介紹了Nacos作為配置中心的基本使用,而本小節(jié)將介紹相同應(yīng)用下的配置共享,所謂的配置共享就是一些配置項(xiàng)可以在相同應(yīng)用的不同環(huán)境中進(jìn)行共享。

例如以上示例中的${your.configuration}配置項(xiàng),我們希望在所有的環(huán)境下該配置項(xiàng)都是相同的值,而又不想在每個(gè)環(huán)境的配置文件里面都配置一遍,也就是說這個(gè)配置項(xiàng)是所有環(huán)境通用的,那么這時(shí)候就需要將該配置項(xiàng)在所有環(huán)境中共享了。

想要實(shí)現(xiàn)配置共享只需要新建一個(gè)配置文件即可,首先我們來看一段日志信息,當(dāng)我們啟動項(xiàng)目時(shí),控制臺會出輸出如下一段日志信息:

2019-09-11 20:47:42.197  INFO 13778 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='content-center-dev.yaml'}, NacosPropertySource {name='content-center.yaml'}]}

從該日志信息可以看到,項(xiàng)目在啟動時(shí)會到Nacos上讀取兩個(gè)配置文件,即content-center-dev.yamlcontent-center.yaml,其中content-center-dev.yaml里保存的是開發(fā)環(huán)境下特定的配置,而content-center.yaml里保存的則是所有環(huán)境下通用的配置。項(xiàng)目在啟動時(shí)具體讀取哪個(gè)環(huán)境的配置文件是由bootstrap.yml文件中的spring.profiles.active配置項(xiàng)所決定的。

既然我們知道保存在content-center.yaml里的配置項(xiàng)會在所有環(huán)境中共享,那么只需要到Nacos上新建這個(gè)配置文件即可。如下示例:
Spring Cloud Alibaba之配置管理組件 - Nacos

新建完成后,修改項(xiàng)目中的spring.profiles.active為其他環(huán)境,然后重啟項(xiàng)目,此時(shí)訪問/getConfiguration接口,可以看到返回的是通用配置文件里所配置的值:
Spring Cloud Alibaba之配置管理組件 - Nacos

  • Tips:特定環(huán)境下的配置優(yōu)先級高于通用環(huán)境配置,例如${your.configuration}配置項(xiàng)同時(shí)存在于content-center-dev.yamlcontent-center.yaml中,若spring.profiles.active的值為dev,那么讀取的將是content-center-dev.yaml里所配置的值。

以上介紹了相同應(yīng)用在不同環(huán)境下的配置共享,但如何實(shí)現(xiàn)不同應(yīng)用之間的配置共享呢?例如我們經(jīng)常會遇到微服務(wù)A和微服務(wù)B的數(shù)據(jù)庫配置是一樣的,如果能將這段相同的配置在這兩個(gè)服務(wù)之間共享,那么就可以省去一些重復(fù)的工作。

目前Nacos提供了兩種方式可以實(shí)現(xiàn)不同應(yīng)用之間的配置共享,第一種方式是使用shared-dataids。接下來我們進(jìn)行一個(gè)簡單的演示,首先需要到Nacos上創(chuàng)建一些共享配置,如下示例:
Spring Cloud Alibaba之配置管理組件 - Nacos

其中common1.yaml配置內(nèi)容如下:

common1:
  configuration1: common1_value

common2.yaml配置內(nèi)容如下:

common2:
  configuration2: common2_value

創(chuàng)建共享配置完成后,修改項(xiàng)目中的bootstrap.yml文件如下:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        # 指定共享配置的DataId,多個(gè)使用,分隔
        # 越靠后,優(yōu)先級越高;common2.yml > common1.yaml
        # .yaml后綴不能少,目前只支持yaml/properties
        shared-dataids: common1.yaml,common2.yaml
        # 指定哪些共享配置支持動態(tài)刷新,多個(gè)使用,分隔
        refreshable-dataids: common1.yaml
        server-addr: 127.0.0.1:8848
        file-extension: yaml
  application:
    name: content-center
  profiles:
    active: dev

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

然后我們來寫兩個(gè)簡單的接口驗(yàn)證一下是否能正常讀取這兩個(gè)共享配置的值,代碼如下:

@RefreshScope
@RestController
@RequiredArgsConstructor
public class TestController {

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

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

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

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

啟動項(xiàng)目,訪問結(jié)果如下:
Spring Cloud Alibaba之配置管理組件 - Nacos
Spring Cloud Alibaba之配置管理組件 - Nacos


第二種方式也是差不多的,只不過使用的配置項(xiàng)是ext-config,修改項(xiàng)目中的bootstrap.yml文件如下:

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

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

shared-dataids < ext-config < 自動

除此之外,當(dāng)存在相同的遠(yuǎn)程配置和本地配置時(shí),遠(yuǎn)程配置優(yōu)先級要高于本地配置文件。但可以通過添加如下配置調(diào)整,需要注意的是這段配置需要放在遠(yuǎn)程配置才會生效:

spring:
  cloud:
    config:
      # 是否允許本地配置覆蓋遠(yuǎn)程配置,默認(rèn)true
      allow-override: true
      # 是否一切以本地配置為準(zhǔn),默認(rèn)false
      override-none: false
      # 系統(tǒng)環(huán)境變量或系統(tǒng)屬性才能覆蓋遠(yuǎn)程配置文件的配置
      # 本地配置文件中配置的優(yōu)先級低于遠(yuǎn)程配置,默認(rèn)true
      override-system-properties: true

為什么要使用bootstrap.yml

在介紹為項(xiàng)目整合Nacos做配置管理服務(wù)的時(shí)候,示例里將Nacos Config的相關(guān)配置都寫在一個(gè)bootstrap.yml文件里,但是為什么要使用bootstrap.yml呢?使用application.yml不可以嗎?

這是其實(shí)是因?yàn)?code>bootstrap.yml會被優(yōu)先讀取,也就是說如果項(xiàng)目里同時(shí)存在一個(gè)bootstrap.yml和一個(gè)application.yml的話,那么bootstrap.yml將會優(yōu)先于application.yml被Spring Boot讀取。這樣才能實(shí)現(xiàn)連接外部的配置管理服務(wù)器,從遠(yuǎn)程讀取一些必要的配置,避免項(xiàng)目在啟動時(shí)缺失必要配置項(xiàng)而導(dǎo)致啟動失敗。

這里實(shí)際涉及到一個(gè)引導(dǎo)上下文的概念,它是ApplicationContext的父上下文,并且是由Spring Cloud提供的, 它所在的位置如下圖所示:
Spring Cloud Alibaba之配置管理組件 - Nacos

引導(dǎo)上下文在prepareEnvironment的階段就會被創(chuàng)建,創(chuàng)建時(shí)會讀取bootstrap.yml的內(nèi)容作為引導(dǎo)配置, 因此bootstrap.yml優(yōu)先于application.yml加載。引導(dǎo)上下文與操作系統(tǒng)的引導(dǎo)程序非常類似,而bootstrap.yml就相當(dāng)于設(shè)置引導(dǎo)程序的相關(guān)指令。


關(guān)于Nacos的數(shù)據(jù)持久化

Nacos會將數(shù)據(jù)持久化到本地,當(dāng)Nacos作為服務(wù)發(fā)現(xiàn)組件時(shí),默認(rèn)會將服務(wù)的注冊信息存儲在如下目錄中:

類Unix系統(tǒng):~/nacos/naming
windows系統(tǒng):C:\用戶\{用戶名}\nacos\naming

具體文件如下圖所示:
Spring Cloud Alibaba之配置管理組件 - Nacos

打開其中一個(gè)文件,可以看到服務(wù)注冊信息的格式如下:

{
    "metadata": {},
    "dom": "DEFAULT_GROUP@@content-center",
    "cacheMillis": 10000,
    "useSpecifiedURL": false,
    "hosts": [],
    "name": "DEFAULT_GROUP@@content-center",
    "checksum": "f797b857f5312a616a875924ecf6481a",
    "lastRefTime": 1564815242804,
    "env": "",
    "clusters": ""
}

當(dāng)Nacos作為配置中心時(shí),配置數(shù)據(jù)會分為兩份并存儲在兩個(gè)地方,其中一份存儲在內(nèi)嵌的derby數(shù)據(jù)庫中,這是Apache開源的一個(gè)完全由Java編寫的內(nèi)嵌數(shù)據(jù)庫,而derby會有一個(gè)數(shù)據(jù)目錄,如下:

$NACOS_HOME/data/derby-data

我們可以使用IDEA連接derby來查看相關(guān)的數(shù)據(jù)表及存儲內(nèi)容,在右邊菜單欄中點(diǎn)開Database -> 點(diǎn)擊+符號添加數(shù)據(jù)庫連接 -> Data Source -> Apache Derby。如下圖所示:
Spring Cloud Alibaba之配置管理組件 - Nacos

注意,此時(shí)需要將Nacos Server給停止掉,否則是無法連接的。停止Nacos Server之后,填寫相關(guān)的連接信息,Path填的是derby的數(shù)據(jù)目錄,用戶和密碼默認(rèn)都是nacos。如下圖所示:
Spring Cloud Alibaba之配置管理組件 - Nacos

連接成功后,可以看到derby中的數(shù)據(jù)表如下:
Spring Cloud Alibaba之配置管理組件 - Nacos

其中CONFIG_INFO表存儲了配置數(shù)據(jù),打開該表可以看到內(nèi)容如下:
Spring Cloud Alibaba之配置管理組件 - Nacos

需要注意的是derby并不能用于生產(chǎn)環(huán)境,因?yàn)樗且粋€(gè)內(nèi)嵌數(shù)據(jù)庫,無法實(shí)現(xiàn)高可用和集群部署,所以一般搭建生產(chǎn)可用的Nacos時(shí)會將數(shù)據(jù)庫改為使用MySQL等非內(nèi)嵌數(shù)據(jù)庫。

而另一份數(shù)據(jù)存儲在如下目錄,主要是一些快照等數(shù)據(jù):

類Unix系統(tǒng):~/nacos/config
windows系統(tǒng):C:\用戶\{用戶名}\nacos\config

快照主要用于提升性能以及做容災(zāi)備份,具體文件如下圖所示:
Spring Cloud Alibaba之配置管理組件 - Nacos

當(dāng)前標(biāo)題:SpringCloudAlibaba之配置管理組件-Nacos
URL標(biāo)題:http://bm7419.com/article12/jdedgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)站導(dǎo)航手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司