源碼地址: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 Conig類似,我們必需要在 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
說明:之所以需要配置
spring.application.name
,是因為它是構成 Nacos 配置管理dataId
字段的一部分。
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默認為spring.application.name
的值,也可以通過配置項spring.cloud.nacos.config.prefix
來配置。spring.profile.active
即為當前環境對應的 profile。注意:當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作為分布式配置中心的實戰到此結束了,了解更多可以直接查看官方文檔!
系列文章持續更新中!
"簡單的事情重復做,重復的事情認真做,認真的事情有創造性地做!"——
我是三分惡,可以叫我老三/三分/三哥/三子,一個能文能武的全棧開發,咱們下期見!
參考:
【1】:小專欄 《SpringCloudAlibaba微服務實戰》
【2】:nacos 實戰(史上最全)