之前一直引入攜程的
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è)配置集。
配置集(Data ID)
在系統(tǒng)中告组,一個(gè)配置文件通常就是一個(gè)配置集,一個(gè)配置集可以包含了系統(tǒng)的各種配置信息癌佩,例如木缝,一個(gè)配置集可能包含了數(shù)據(jù)源、線程池围辙、日志級(jí)別等配置項(xiàng)我碟。每個(gè)配置集都可以定義一個(gè)有意義的名稱,就是配置集的ID即DataID姚建。配置項(xiàng)
配置集中包含的一個(gè)個(gè)配置內(nèi)容就是配置項(xiàng)矫俺。它代表一個(gè)具體的可配置的參數(shù)與其值域,通常以 key=value 的形式存在。例如我們常配置系統(tǒng)的日志輸出級(jí)別(logLevel=INFO|WARN|ERROR) 就是一個(gè)配置項(xiàng)厘托。配置分組(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。命名空間(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)項(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è)工程的主配置文件 |
使用說明
獲取配置集需要:
-
nacos
服務(wù)地址锨侯,必須指定 -
namespace
,如不指定默認(rèn)public
-
group
冬殃,如不指定默認(rèn)DEFAULT_GROUP
-
dataId
囚痴,必須指定
代碼實(shí)踐
參考上篇文章新建Module
。
- 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>
- 在應(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è)試
- 訪問url:
http://localhost:8080/user
组去。
返回:Hello Nacos Config!Hello 郭秀志 40!
鞍陨。 - 修改Nacos的配置,name修改為
郭秀志(Oliver)
从隆,age修改為43
诚撵,并點(diǎn)擊發(fā)布按鈕。
- 再次訪問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 挎塌。
前面提到了Nacos的
Namespace
概念畅铭,他就是為不同環(huán)境,如:開發(fā)勃蜘、測(cè)試、生產(chǎn)環(huán)境而生假残。接下來我們采用Namespace
來區(qū)分不同環(huán)境的配置缭贡。
-
創(chuàng)建多套namespace炉擅。
3個(gè)環(huán)境的命名空間 - 注釋激活屬性文件配置
profiles:
#active: dev #指定開發(fā)環(huán)境
-
DEV、TEST阳惹、PROD
3個(gè)空間分別添加配置信息
TEST環(huán)境信息配置
為了區(qū)分返回值谍失,其他兩個(gè)環(huán)境配置內(nèi)容稍不同:
user:
name: guo from DEV
age: 2
user:
name: guo from PROD
age: 3
- 指定使用的名稱空間。
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”
快鱼。
- 測(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