源碼位址: https://gitee.com/fighter3/eshop-project.git 持續更新中……
在我們前面介紹Nacos的時候,說到,Nacos除了可以作為注冊中心,還可以作為配置中心,而在SpringCloud Netfilx的體系下,這個工作是由Spring Cloud Config完成的。
至于為什麼需要配置中心?大家想一下,在微服務開發體系下,整個系統可能被拆分成幾十、上百個服務,在生産的時候,每個服務可能部署幾十上百個節點,而且通常是又多個環境,如開發、測試、預釋出、成産等等,如果沒有一個集中式的配置中心,一個個去管理,那是一個多麼😥的事情。
好了,接下來我們開始愉快地學習Nacos作為分布式配置中心吧!
1、Nacos配置基本概念
在正式開始實戰之前,我們先了解一下Nacos配置的一些基本概念。
上圖我們可以看到Nacos作為配置中心的幾個主要概念:
- 命名空間
區分環境,比如:dev、test、prod 等等。
用于進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等。
- 配置分組
多個配置檔案放在一起,形成組,一般用于區分項目。例如,某學校多應用之間的區分,教師應用 TEACHER_GROUP,學生應用 STUDENT_GROUP。
Nacos 中的一組配置集,是組織配置的次元之一。通過一個有意義的字元串(如 Buy 或 Trade )對配置集進行分組,進而區分 Data ID 相同的配置集。當您在 Nacos 上建立一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱預設采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或元件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。
- 配置集
多個鍵值對,一般指一個配置檔案。
一組相關或者不相關的配置項的集合稱為配置集(多個鍵值對/一個配置檔案)。在系統中,一個配置檔案通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了資料源、線程池、日志級别等配置項。
- 配置集ID
給這個配置檔案起一個全局唯一的 ID。
Nacos 中的某個配置集的 ID。配置集 ID 是組織劃配置設定置的次元之一。Data ID 通常用于組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱辨別。Data ID 通常采用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則保證全局唯一性。此命名規則非強制。
- 配置項
一個鍵值對 <Key = Value>
一個具體的可配置的參數與其值域(一個鍵值對),通常以 param-key=param-value 的形式存在。例如我們常配置系統的日志輸出級别(logLevel=INFO|WARN|ERROR) 就是一個配置項。
給大家看一個Nacos的配置示例,這些概念相信你就都明白。

2、引入Nacos配置中心
我們以eshop-user為例示範我們的配置中心。
2.1、引入nacos-config依賴
<!-- spring cloud alibaba nacos config 依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2、配置檔案
和SpringCloud Config類似,我們必需要在
bootstrap.yml
配置檔案中進行配置,在
application.yml
中無效,
bootstrap.yml
優先級高于
application.yml
。
spring:
application:
name: user-service # 應用名稱
profiles:
active: dev # 目前環境對應的 profile
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 位址
group: DEFAULT_GROUP # 組,預設為 DEFAULT_GROUP
file-extension: yaml # 配置内容的資料格式,預設為 properties
說明:之是以需要配置,是因為它是構成 Nacos 配置管理
spring.application.name
字段的一部分。
dataId
在 Nacos Spring Cloud 中,
dataId
的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
-
預設為prefix
的值,也可以通過配置項spring.application.name
來配置。spring.cloud.nacos.config.prefix
-
即為目前環境對應的 profile。注意:當spring.profile.active
為空時,對應的連接配接符spring.profile.active
也将不存在,dataId 的拼接格式将變成-
${prefix}.${file-extension}
-
為配置内容的資料格式,可以通過配置項file-exetension
來配置。目前隻支援spring.cloud.nacos.config.file-extension
和properties
類型,預設為yaml
properties
2.3、Nacos Server建立配置
我們在Nacos Server的配置清單中建立一個配置。
Data Id
為
user-service.yaml
,組使用預設組,并添加
yaml
格式的配置資訊。
project:
name: e-shop-userservice
author: fighter3
2.4、控制層
使用 Spring 的
@Value
注解來擷取配置資訊,
${}
中對應 Nacos 配置中心配置内容的 key,
:
後跟預設值。
并且通過 Spring Cloud 原生注解
@RefreshScope
實作配置自動更新。
/**
* @Author: 三分惡
* @Date: 2021/5/30
* @Description: Nacos配置項擷取
**/
@RefreshScope
@RestController
@RequestMapping("/shop-user")
@Api(value = "配置資訊接口", tags = "配置資訊接口")
public class NacosConfigController {
@Value("${project.name:}")
private String projectName;
@Value("${project.author:}")
private String projectAuthor;
@GetMapping("/config")
@ApiOperation(value = "擷取Nacos配置項")
public Map<String, Object> getConfig() {
Map<String, Object> configMap = new HashMap();
configMap.put("projectName", projectName);
configMap.put("projectAuthor", projectAuthor);
return configMap;
}
}
2.5、測試
啟動
user-service
服務。
通路knife4j接口位址:http://localhost:8080/doc.html ,調用擷取Nacos配置項接口:
接下來,我們修改一下配置項,并釋出:
可以看到控制台列印輸出:
再次通路擷取配置接口:
OK,到這我們已經成功地讀取了Nacos配置中心的配置,接下來,我們嘗試将服務的配置,例如資料源來進行統一的集中配置。
3、集中配置
好,我們開始進行Nacos集中配置的實戰:
3.1、建立命名空間
我們之前用的是預設的命名空間,接下來我們建立一個新的命名空間,用于我們開發環境的配置。我們給它命名為
dev_space
:
這裡使用了命名空間來隔離配置,如果我們想要一個測試環境的配置,如法炮制,建一個新的空間就行了。
3.2、建立資料源配置
接下來我們在
dev_space
下建立一個新的配置
user-service-dev.yaml
project:
name: e-shop-userservice
author: fighter3
# 資料源配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop_user?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8
username: root
password: root
3.3、修改本地配置
我們在bootstrap.yml中指定命名空間,完整bootstrap.yml如下:
spring:
application:
name: user-service # 應用名稱
profiles:
active: dev # 目前環境對應的 profile
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 位址
group: DEFAULT_GROUP # 組,預設為 DEFAULT_GROUP
file-extension: yaml # 配置内容的資料格式,預設為 properties
namespace: dev_space # 指定命名空間,預設為public
修改application.yml,注釋掉資料源相關配置:
3.4、測試
啟動使用者服務,服務正常啟動以後,我們分别調試擷取使用者資訊接口和擷取配置接口。
OK,擷取到了預期的結果。
好了,Nacos作為分布式配置中心的實戰到此結束了,了解更多可以直接檢視官方文檔!
系列文章持續更新中!
“簡單的事情重複做,重複的事情認真做,認真的事情有創造性地做!”——
我是三分惡,可以叫我老三/三分/三哥/三子,一個能文能武的全棧開發,咱們下期見!