Spring Cloud Alibaba(三碟绑、Nacos配置中心)

之前一直引入攜程的Apollo做配置中心使用。但Apollo比較重茎匠,需自己運(yùn)維很多組件格仲。半年前發(fā)現(xiàn)Nacos配置管理易用。支持配置熱更新诵冒,支持命名空間凯肋。本文使用Nacos Config Starter完成Spring Cloud應(yīng)用的配置管理。本質(zhì)是通過Nacos替代application.yml本地配置文件汽馋,用法也是@Value("${user.name}")注解給變量賦值侮东。

Nacos配置管理模型幾個(gè)概念

對(duì)于Nacos配置管理,通過Namespace豹芯、group苗桂、Data ID能夠定位到一個(gè)配置集。

數(shù)據(jù)定義層次

  1. 配置集(Data ID)
    在系統(tǒng)中告组,一個(gè)配置文件通常就是一個(gè)配置集,一個(gè)配置集可以包含了系統(tǒng)的各種配置信息癌佩,例如木缝,一個(gè)配置集可能包含了數(shù)據(jù)源、線程池围辙、日志級(jí)別等配置項(xiàng)我碟。每個(gè)配置集都可以定義一個(gè)有意義的名稱,就是配置集的ID即DataID姚建。

  2. 配置項(xiàng)
    配置集中包含的一個(gè)個(gè)配置內(nèi)容就是配置項(xiàng)矫俺。它代表一個(gè)具體的可配置的參數(shù)與其值域,通常以 key=value 的形式存在。例如我們常配置系統(tǒng)的日志輸出級(jí)別(logLevel=INFO|WARN|ERROR) 就是一個(gè)配置項(xiàng)厘托。

  3. 配置分組(Group)
    配置分組是對(duì)配置集進(jìn)行分組友雳,通過一個(gè)有意義的字符串(如 Buy 或 Trade )來表示,不同的配置分組下可以有相同的配置集(Data ID)铅匹。當(dāng)您在 Nacos 上創(chuàng)建一個(gè)配置時(shí)押赊,如果未填寫配置分組的名稱,則配置分組的名稱默認(rèn)采用 DEFAULT_GROUP 包斑。配置分組的常見場(chǎng)景:可用于區(qū)分不同的項(xiàng)目或應(yīng)用流礁,例如:學(xué)生管理系統(tǒng)的配置集可以定義一個(gè)group為:STUDENT_GROUP。

  4. 命名空間(Namespace)
    命名空間(namespace)可用于進(jìn)行不同環(huán)境的配置隔離罗丰。例如可以隔離開發(fā)環(huán)境神帅、測(cè)試環(huán)境和生產(chǎn)環(huán)境,因?yàn)樗鼈兊呐渲每赡芨鞑幌嗤鹊郑蛘呤歉綦x不同的用戶找御,不同的開發(fā)人員使用同一個(gè)nacos管理各自的配置,可通過namespace隔離谜嫉。不同的命名空間下萎坷,可以存在相同名稱的配置分組(Group) 或 配置集。

模型層次詳解

Nacos抽象定義了Namespace沐兰、Group哆档、Data ID的概念,具體這幾個(gè)概念代表什么住闯,取決于我們把它們看成什么瓜浸,這里推薦給大家一種用法,如下圖:

對(duì)應(yīng)關(guān)系

對(duì)應(yīng)關(guān)系:

配置模型 對(duì)應(yīng)項(xiàng)目
Namespace 代表不同環(huán)境比原,如:開發(fā)插佛、測(cè)試、生產(chǎn)環(huán)境量窘。
Group 代表某項(xiàng)目雇寇,如:XX金融項(xiàng)目、XX電商項(xiàng)目
DataId 每個(gè)項(xiàng)目下往往有若干個(gè)工程蚌铜,每個(gè)配置集(DataId)是一個(gè)工程的主配置文件

使用說明

獲取配置集需要:

  1. nacos服務(wù)地址锨侯,必須指定
  2. namespace,如不指定默認(rèn)public
  3. group冬殃,如不指定默認(rèn)DEFAULT_GROUP
  4. dataId囚痴,必須指定

代碼實(shí)踐

參考上篇文章新建Module

Spring Initializr創(chuàng)建項(xiàng)目

選擇Nacos Configuration依賴

  1. POM文件引入Nacos Config Starter审葬。注:IDEA工具的向?qū)ё詣?dòng)生成POM有問題深滚,參考我修改后的POM文件奕谭。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.pay.springcloud.alibaba</groupId>
    <artifactId>nacos-config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-config</name>
    <description>Nacos config project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  1. 在應(yīng)用的 /src/main/resources/新增bootstrap.yml 配置文件,用來配置 Nacos Config 元數(shù)據(jù)痴荐。bootstrap.yml從配置中心拉取Nacos動(dòng)態(tài)配置血柳,其他的配置可再讀取application.yml。如果相同屬性application.yml值會(huì)覆蓋bootstrap.yml定義的值蹬昌,bootstrap.yml文件內(nèi)容:
server:
  port: 8081
spring:
  application:
    name: nacos-config-client
  profiles:
    active: dev #指定開發(fā)環(huán)境
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 #服務(wù)器地址
        group: bankProject #指定配置群組 --如果是Public組混驰,則可以省略群組配置
        prefix: guoxiuzhiPrefix #Data ID 前綴 -- 如果沒有配置則默認(rèn)為 ${spring.appliction.name}
        file-extension: yml #指定文件后綴,yaml格式的配置

命名約定:
Data ID =${spring.cloud.nacos.config.prefix}.${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 最終拼接出來的就是:guoxiuzhiPrefix-dev.yml (一定要注意約定!)
Group = ${spring.cloud.nacos.config.group}
spring.cloud.nacos.config.prefix默認(rèn)為spring.application.name的值皂贩,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置栖榨。

說明:

  • spring.profile.active 即為當(dāng)前環(huán)境對(duì)應(yīng)的 profile,注意:當(dāng) spring.profile.active 為空時(shí)明刷,對(duì)應(yīng)的連接符 - 也將不存在婴栽,dataId 的拼接格式變成${prefix}.${file-extension}
  • file-exetension 為配置內(nèi)容的數(shù)據(jù)格式辈末,可以通過配置項(xiàng) spring.cloud.nacos.config.file-extension來配置愚争。支持 properties 和 yaml 類型。

在nacos上新建配置文件

根據(jù)上面規(guī)則挤聘, Data ID配置如下:

配置信息

調(diào)用配置信息

Controller代碼

package com.pay.springcloud.alibaba.nacosconfig.nacosconfig;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName:  SampleController
 * @Description: Nacos配置信息動(dòng)態(tài)讀取
 * @author: 郭秀志 jbcode@126.com
 * @date:   2020/6/13 18:30
 * @Copyright:
 */
@RestController
@RefreshScope
public class SampleController {

    @Value("${user.name}")
    String userName;

    @Value("${user.age:25}")
    int age;

    @RequestMapping("/user")
    public String simple() {
        return "Hello Nacos Config!" + "Hello " + userName + " " + age + "!";
    }
}
  • 通過 Spring Cloud 原生注解@RefreshScope實(shí)現(xiàn)配置自動(dòng)更新轰枝,這是controller中加這個(gè)注解的原因。

測(cè)試

  1. 訪問url:http://localhost:8080/user组去。
    返回:Hello Nacos Config!Hello 郭秀志 40!鞍陨。
  2. 修改Nacos的配置,name修改為郭秀志(Oliver)从隆,age修改為43诚撵,并點(diǎn)擊發(fā)布按鈕。
  3. 再次訪問url:http://localhost:8080/user键闺。
    返回:Hello Nacos Config!Hello 郭秀志(Oliver) 43!寿烟。可見配置屬性已經(jīng)被代碼動(dòng)態(tài)識(shí)別辛燥。

Namespace來區(qū)分環(huán)境

上面是通過激活哪個(gè)配置文件來調(diào)用不同環(huán)境的配置信息筛武。
profiles.active: dev對(duì)應(yīng)要建Data ID是guoxiuzhiPrefix-dev.yml,如果生產(chǎn)環(huán)境要建guoxiuzhiPrefix-prod.yml 挎塌。

Data ID區(qū)分環(huán)境

前面提到了Nacos的Namespace概念畅铭,他就是為不同環(huán)境,如:開發(fā)勃蜘、測(cè)試、生產(chǎn)環(huán)境而生假残。接下來我們采用Namespace來區(qū)分不同環(huán)境的配置缭贡。

  1. 創(chuàng)建多套namespace炉擅。


    3個(gè)環(huán)境的命名空間
  2. 注釋激活屬性文件配置
profiles:
    #active: dev #指定開發(fā)環(huán)境
  1. DEV、TEST阳惹、PROD3個(gè)空間分別添加配置信息
    TEST環(huán)境信息配置

    為了區(qū)分返回值谍失,其他兩個(gè)環(huán)境配置內(nèi)容稍不同:
user:
  name: guo from DEV
  age: 2
user:
  name: guo from PROD
  age: 3
  1. 指定使用的名稱空間。
    bootstrap.yml完整內(nèi)容
server:
  port: 8081
spring:
  application:
    name: nacos-config-client
  profiles:
    #active: dev #指定開發(fā)環(huán)境
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 #服務(wù)器地址
        #namespace 注意這里是nacos生成的Namespace ID 字符串而不是DEV
        namespace: 5e476dab-9ae9-4626-bdab-f065f12196d3
        group: bankProject #指定配置群組 --如果是Public命名空間 則可以省略群組配置
        prefix: guoxiuzhiPrefix #文件名 -- 如果沒有配置則默認(rèn)為 ${spring.appliction.name}
        file-extension: yml #指定文件后綴,yml格式的配置

說明:namespace值是nacos生成的“Namespace ID ”字符串莹汤,而不是命名空間名稱“DEV”快鱼。

Namespace ID

  1. 測(cè)試
    訪問url:http://localhost:8080/user
    返回:Hello Nacos Config!Hello guo from DEV 2!
    證明已經(jīng)取了DEV命名空間的相關(guān)配置纲岭。

基于Namespace的Jekins部署或手動(dòng)發(fā)包

切換環(huán)境時(shí)抹竹,只需更改namespace即可。

原啟動(dòng)參數(shù):--spring.profiles.active=dev
需要替換參數(shù)為:--spring.cloud.nacos.config.namespace=5e476dab-9ae9-4626-bdab-f065f12196d3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末止潮,一起剝皮案震驚了整個(gè)濱河市窃判,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喇闸,老刑警劉巖袄琳,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異燃乍,居然都是意外死亡唆樊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門刻蟹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逗旁,“玉大人,你說我怎么就攤上這事座咆×∫眨” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵介陶,是天一觀的道長(zhǎng)堤舒。 經(jīng)常有香客問我,道長(zhǎng)哺呜,這世上最難降的妖魔是什么舌缤? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮某残,結(jié)果婚禮上国撵,老公的妹妹穿的比我還像新娘。我一直安慰自己玻墅,他們只是感情好介牙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澳厢,像睡著了一般环础。 火紅的嫁衣襯著肌膚如雪囚似。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天线得,我揣著相機(jī)與錄音饶唤,去河邊找鬼。 笑死贯钩,一個(gè)胖子當(dāng)著我的面吹牛募狂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播角雷,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祸穷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了谓罗?” 一聲冷哼從身側(cè)響起粱哼,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎檩咱,沒想到半個(gè)月后揭措,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刻蚯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年绊含,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炊汹。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躬充,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讨便,到底是詐尸還是另有隱情充甚,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布霸褒,位于F島的核電站伴找,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏废菱。R本人自食惡果不足惜技矮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殊轴。 院中可真熱鬧衰倦,春花似錦、人聲如沸旁理。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孽文。三九已至驻襟,卻和暖如春十性,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塑悼。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楷掉,地道東北人厢蒜。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像烹植,于是被迫代替她去往敵國和親斑鸦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354