原始碼地址: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 實戰(史上最全)