Spring Cloud 系列之 Alibaba Nacos 配置中心
阿新 • • 發佈:2020-06-16
## Nacos 介紹
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81969149073?w=2001&h=391&f=png&s=35417 " ")
Nacos 是 Alibaba 公司推出的開源工具,用於實現分散式系統的服務發現與配置管理。英文全稱 Dynamic Naming and Configuration Service,Na 為 Naming/NameServer 即註冊中心,co 為 Configuration 即配置中心,Service 是指該註冊/配置中心都是以服務為核心。服務(Service)是 Nacos 世界的一等公民。
> 官網是這樣說的:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
Nacos 致力於發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,可以快速實現動態服務發現、服務配置、服務元資料及流量管理。
Nacos 可以更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構的服務基礎設施。
使用 Nacos 簡化服務發現、配置管理、服務治理及管理的解決方案,讓微服務的發現、管理、共享、組合更加容易。
Nacos 官網:https://nacos.io/zh-cn/
Github:https://github.com/alibaba/nacos
## Nacos 安裝
### 環境準備
Nacos 依賴 Java 環境來執行。如果您是從程式碼開始構建並執行 Nacos,還需要為此配置 Maven 環境,請確保是在以下版本環境中安裝使用:
- JDK 1.8+;
- Maven 3.2.x+。
### 下載原始碼或者安裝包
可以通過原始碼和發行包兩種方式來獲取 Nacos。
#### 原始碼方式
從 Github 上下載原始碼方式。
```shell
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
```
#### 發行包方式
您可以從 https://github.com/alibaba/nacos/releases 下載最新穩定版本的 `nacos-server` 包。
### 啟動伺服器
#### Linux/Unix/Mac
在 Nacos 的解壓目錄 `nacos/bin` 目錄下啟動。
啟動命令(standalone 代表著單機模式執行,非叢集模式):
```shell
sh startup.sh -m standalone
```
如果您使用的是 ubuntu 系統,或者執行指令碼報錯提示符號找不到,可嘗試如下執行:
```shell
bash startup.sh -m standalone
```
#### Windows
啟動命令:
```shell
cmd startup.cmd
```
或者雙擊 `startup.cmd` 執行檔案。
### 訪問
訪問:http://localhost:8848/nacos/ ,預設使用者名稱/密碼是 nacos/nacos。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb8196b2220de?w=1358&h=678&f=png&s=57575 " ")
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819693ae028?w=1383&h=492&f=png&s=33549 " ")
### 關閉伺服器
#### Linux/Unix/Mac
```
sh shutdown.sh
```
#### Windows
```
cmd shutdown.cmd
```
或者雙擊 `shutdown.cmd` 執行檔案。
## 配置 MySQL 資料庫
Nacos 在 `0.7` 版本之前,預設使用的是嵌入式資料庫 `Apache Derby` 來儲存資料(內嵌的資料庫會隨著 Nacos 一起啟動,無需額外安裝);`0.7` 版本及以後,增加了對 `MySQL` 資料來源的支援。
### MySQL資料來源
環境要求:MySQL 5.6.5+(生產使用建議至少主備模式,或者採用高可用資料庫);
#### 初始化 MySQL 資料庫
建立資料庫 `nacos_config`。
SQL原始檔地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql ,或者在 `nacos-server` 解壓目錄 `conf` 下,找到 `nacos-mysql.sql` 檔案,執行該檔案,結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81968d85d86?w=243&h=301&f=png&s=7546 " ")
#### application.properties 配置
修改 `nacos/conf/application.properties` 檔案的以下內容。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb8196a6b21bc?w=743&h=251&f=png&s=23245 " ")
最終修改結果如下:
```properties
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# 指定資料來源為 MySQL
spring.datasource.platform=mysql
### Count of DB:
# 資料庫例項數量
db.num=1
# 資料庫連線資訊,如果是 MySQL 8.0+ 版本需要新增 serverTimezone=Asia/Shanghai
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user=root
db.password=1234
```
> 如果你和我一樣使用的是 MySQL 8.0+ 版本,那麼啟動 Nacos 時肯定會報錯。莫慌,在 Nacos 安裝目錄下新建 `plugins/mysql` 資料夾,並放入 8.0+ 版本的 mysql-connector-java-8.0.xx.jar,重啟 Nacos 即可,啟動時會提示更換了 MySQL 的 driver-class 類。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81968ba5b69?w=983&h=61&f=png&s=4426 " ")
## Nacos 配置入門
`nacos-config-demo` 聚合工程。`SpringBoot 2.3.0.RELEASE`、`Spring Cloud Hoxton.SR5`。
### 釋出配置
選擇 `配置管理` 的 `配置列表` 頁面,點選最右側 `+` 按鈕新建配置。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819b0fbf608?w=1376&h=487&f=png&s=35971 " ")
Nacos Config 使用 `Data ID` 和 `Group` 來確定配置。
下圖顯示 `Data Id` 為 `product-service.yaml`,組使用預設組,並新增 `yaml` 格式的配置資訊。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819c99a6c40?w=920&h=584&f=png&s=26003 " ")
```yaml
project:
name: SpringCloudAlibaba
org: Aliababa
```
### 獲取配置
#### 建立專案
我們建立聚合專案來講解 Nacos,首先建立一個 pom 父工程。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819ce5e1e7e?w=629&h=493&f=png&s=52501 " ")
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819dc20ce35?w=629&h=493&f=png&s=18412 " ")
#### 新增依賴
pom.xml
```xml
4.0.0
org.example
nacos-config-demo
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE
Hoxton.SR5
2.1.0.RELEASE
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
```
#### 商品服務 product-service
##### 建立專案
在剛才的父工程下建立一個 `product-service` 專案。
##### 新增依賴
主要新增 `spring-cloud-starter-alibaba-nacos-config` 依賴。
```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
```
完整依賴如下:
```xml
nacos-config-demo
org.example
1.0-SNAPSHOT
4.0.0
product-service
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
provided
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
```
##### 配置檔案
在 `bootstrap.yml` 中配置 Nacos Server 的地址和應用名。
```yml
server:
port: 7070 # 埠
spring:
application:
name: product-service # 應用名稱
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` 的完整格式如下:
```properties
${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`。
##### 控制層
使用 Spring 的 `@Value` 註解來獲取配置資訊,`${}` 中對應 Nacos 配置中心配置內容的 key,`:`後跟預設值。
並且通過 Spring Cloud 原生註解 `@RefreshScope` 實現配置自動更新。
```java
package org.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RefreshScope
@RestController
public class ConfigController {
@Value("${project.name:}")
private String projectName;
@Value("${project.org:}")
private String projectOrg;
@GetMapping("/config")
public Map getConfig() {
Map configMap = new HashMap();
configMap.put("projectName", projectName);
configMap.put("projectOrg", projectOrg);
return configMap;
}
}
```
##### 啟動類
```java
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProductServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProductServiceApplication.class, args);
}
}
```
##### 測試
訪問:http://localhost:7070/config 結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819dcaaf692?w=364&h=135&f=png&s=12259 " ")
修改配置為以下內容,重新發布:
```yaml
project:
name: SpringCloudAlibaba-Nacos
org: Aliababa
```
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819ec651419?w=1198&h=333&f=png&s=28318 " ")
控制檯列印資訊如下:
```shell
c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'product-service.yaml', group: 'DEFAULT_GROUP'
b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-product-service.yaml'}]
o.s.boot.SpringApplication : No active profile set, falling back to default profiles: default
o.s.boot.SpringApplication : Started application in 3.356 seconds (JVM running for 50.676)
o.s.c.e.event.RefreshEventListener : Refresh keys changed: [project.name]
```
訪問:http://localhost:7070/config 結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819fabe48f4?w=399&h=130&f=png&s=13232 " ")
## Nacos 配置核心概念
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a0882bc08?w=688&h=582&f=jpeg&s=78225 " ")
### 配置
> 為什麼需要配置?概念。
在系統開發過程中,開發者通常會將一些需要變更的引數、變數等從程式碼中分離出來獨立管理,以獨立的配置檔案的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理執行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成。配置變更是調整系統執行時的行為的有效手段。
### 配置管理
> 對配置的多維度管理。
系統配置的編輯、儲存、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動。
### 配置項
> 一個鍵值對 Key = Value。
一個具體的可配置的引數與其值域(一個鍵值對),通常以 param-key=param-value 的形式存在。例如我們常配置系統的日誌輸出級別(logLevel=INFO|WARN|ERROR) 就是一個配置項。
### 配置集
> 多個鍵值對,一般指一個配置檔案。
一組相關或者不相關的配置項的集合稱為配置集(多個鍵值對/一個配置檔案)。在系統中,一個配置檔案通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了資料來源、執行緒池、日誌級別等配置項。
### 配置集 ID
> 給這個配置檔案起一個全域性唯一的 ID。
Nacos 中的某個配置集的 ID。配置集 ID 是組織劃分配置的維度之一。Data ID 通常用於組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。Data ID 通常採用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則保證全域性唯一性。此命名規則非強制。
### 配置分組
> 多個配置檔案放在一起,形成組,一般用於區分專案。例如,某學校多應用之間的區分,教師應用 TEACHER_GROUP,學生應用 STUDENT_GROUP。
Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上建立一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱預設採用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或元件使用了相同的配置型別,如 database_url 配置和 MQ_topic 配置。
### 配置快照
> 快取配置資訊。
Nacos 的客戶端 SDK 會在本地生成配置的快照。當客戶端無法連線到 Nacos Server 時,可以使用配置快照顯示系統的整體容災能力。配置快照類似於 Git 中的本地 commit,也類似於快取,會在適當的時機更新,但是並沒有快取過期(expiration)的概念。
### 名稱空間
> 區分環境,比如:dev、test、prod 等等。
用於進行租戶粒度的配置隔離。不同的名稱空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
### 最佳實踐
通常我們可以這樣定義 Namespace,Group,DataId:
- `Namespace`:代表不同的**環境**,如:開發、測試, 生產等;
- `Group`:代表某個**專案**,如:XX物流專案,XX教育專案;
- `DataId`:每個專案下往往有若干個**應用**,每個配置集(DataId)是一個應用的**主配置檔案**
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819fbe56e20?w=1280&h=396&f=png&s=92717 " ")
## Namespace 名稱空間
前面已經介紹過名稱空間的概念,用於隔離多個環境,而每個應用在不同環境的同一個配置(如資料庫資料來源)的值是不一樣的。因此,我們針對企業專案實際研發流程和環境進行規劃。
如某軟體公司擁有開發、測試、生產三套環境,那麼我們應該建立三個 Namespace 進行區分。
### 建立名稱空間
點選左側選單 `名稱空間`,看到預設有一個 `public(保留空間)`,點選右側 `新建名稱空間`進行建立。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a2af380f8?w=1378&h=490&f=png&s=28495 " ")
按下圖的方式分別建立 `dev(開發環境)`、`test(測試環境)`、`prod(生產環境)` 三個名稱空間。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a2aebd6bc?w=703&h=333&f=png&s=11294 " ")
最終結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a5cc2a06c?w=1197&h=330&f=png&s=23485 " ")
### 指定名稱空間
如果 `spring.cloud.nacos.config.namespace` 中沒有指定名稱空間,則使用 Nacos 的 public(保留空間)。還可以按以下方式指定自定義名稱空間:
```properties
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
```
> 此配置必須在 bootstrap.yml 檔案中。 spring.cloud.nacos.config.namespace 的值是名稱空間的 ID,可以從 Nacos 控制檯中檢索 ID 的值。 新增配置時,請勿選擇其他名稱空間。 否則,將無法正確檢索配置。
### 釋出配置
選擇 `配置管理` 的 `配置列表` 頁面,選擇 `dev` 環境,點選最右側 `+` 按鈕新建配置。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a63a68440?w=1196&h=316&f=png&s=23064 " ")
Nacos Config 使用 `Data ID` 和 `Group` 來確定配置。
下圖顯示 `Data Id` 為 `product-service.yaml`,組使用預設組,並新增 `yaml` 格式的配置資訊。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a8b4673bc?w=921&h=588&f=png&s=26422 " ")
```yaml
project:
name: SpringCloudAlibaba-DEV
org: Aliababa
```
### 獲取配置
#### 配置檔案
bootstrap.yml
```yml
server:
port: 7070 # 埠
spring:
application:
name: product-service # 應用名稱
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: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 對應 dev 環境
```
#### 控制層
使用 Spring 的 `@Value` 註解來獲取配置資訊,`${}` 中對應 Nacos 配置中心配置內容的 key,`:`後跟預設值。
並且通過 Spring Cloud 原生註解 `@RefreshScope` 實現配置自動更新。
```java
package org.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RefreshScope
@RestController
public class ConfigController {
@Value("${project.name:}")
private String projectName;
@Value("${project.org:}")
private String projectOrg;
@GetMapping("/config")
public Map getConfig() {
Map configMap = new HashMap();
configMap.put("projectName", projectName);
configMap.put("projectOrg", projectOrg);
return configMap;
}
}
```
#### 測試
訪問:http://localhost:7070/config 結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a92850317?w=380&h=133&f=png&s=12913 " ")
## Group 組
Group 組資訊可以在新建配置時進行指定,如下圖:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81a93c1bf90?w=907&h=561&f=png&s=25644 " ")
## 配置管理
這一小節我們通過大量配圖演示控制檯的相關操作。
### 新建/編輯/刪除/查詢
右側 `+` 新建配置。單條編輯或刪除選擇操作欄中的編輯或刪除。批量刪除勾選以後選擇左下角紅色刪除。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81aa999283d?w=1197&h=336&f=png&s=32331 " ")
可以通過 `Data Id` 和 `Group` 查詢配置,還可以將查詢結果匯出。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81aa9d72345?w=1196&h=330&f=png&s=30594 " ")
### 匯入/匯出/克隆
前文提到名稱空間用於隔離多個環境,每個應用在不同環境的同一個配置(如資料庫資料來源)的值是不一樣的。也就是說可能大量的配置項都是相同的,個別差異的配置項需要額外修改,在這種情況下,如果一條條重新新增肯定非常不友好,我們可以通過匯入匯出功能實現。
比如,我們將 `dev` 環境下的配置先全選匯出。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81ab054fb25?w=1196&h=330&f=png&s=30271 " ")
然後在 `test` 環境中匯入,檔案上傳後將直接匯入配置,請務必謹慎操作!
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81acd9433d0?w=1190&h=397&f=png&s=35761 " ")
通過克隆也可以達到相同的效果,不同的是克隆可以額外修改 `Data Id` 和 `Group` 資訊。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81ad9abee97?w=1178&h=428&f=png&s=45371 " ")
### 歷史/回滾
選擇 `配置管理` 的 `歷史版本` 頁面,通過 `Data Id` 和 `Group` 查詢歷史,可以檢視每個歷史版本的詳情,或選擇回滾至該版本。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81adb7f2fd7?w=1367&h=479&f=png&s=50274 " ")
### 監聽查詢
Nacos 提供配置訂閱者,也就是監聽者查詢能力,同時提供客戶端當前配置的 MD5 校驗值,以便幫助使用者更好的檢查配置變更以後是否推送到 Client 端。
選擇 `配置管理` 的 `監聽查詢` 頁面,通過 `配置或IP`、`Data Id` 和 `Group` 查詢。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81ae78c26fe?w=1374&h=416&f=png&s=29757 " ")
## 許可權控制
Nacos 提供了基於 RBAC 的許可權控制,通過左側 `許可權控制` 選單的 `使用者列表`、`角色管理`、`許可權管理`實現,可以算是傻瓜式操作了,滑鼠多點幾下就會了。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b08256d23?w=1379&h=485&f=png&s=26040 " ")
## 公共配置
每個配置集對應一個應用,但是開發時我們可能會有一些公共配置被多個應用使用,這時候就需要擴充套件配置集或共享配置集來實現了。
### 擴充套件配置集
我們先建立三個配置集,如下:
```text
Data ID: ext-config-common01.yaml
Group: DEFAULT_GROUP
Configuration format: YAML
Configuration content: common.name: common-service
Data ID: ext-config-common02.yaml
Group: GLOBAL_GROUP
Configuration format: YAML
Configuration content: global.name: global-service
Data ID: ext-config-common03.yaml
Group: REFRESH_GROUP
Configuration format: YAML
Configuration content: refresh.name: refresh-service
```
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b183199f3?w=1193&h=472&f=png&s=47853 " ")
#### 獲取配置
##### 配置檔案
bootstrap.yml
```yaml
server:
port: 7070 # 埠
spring:
application:
name: product-service # 應用名稱
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 地址
group: MALL_GROUP # 組,預設為 DEFAULT_GROUP
file-extension: yaml # 配置內容的資料格式,預設為 properties
namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 對應 dev 環境
# 擴充套件配置集
ext-config[0]:
data-id: ext-config-common01.yaml # 配置集 id
ext-config[1]:
data-id: ext-config-common02.yaml # 配置集 id
group: GLOBAL_GROUP # 組,預設為 DEFAULT_GROUP
ext-config[2]:
data-id: ext-config-common03.yaml # 配置集 id
group: REFRESH_GROUP # 組,預設為 DEFAULT_GROUP
refresh: true # 是否支援動態重新整理
```
總結:
- 通過配置 `spring.cloud.nacos.config.ext-config[n].data-id` 來支援多個配置集。
- 通過配置 `spring.cloud.nacos.config.ext-config[n].group` 來定製配置組。如果未指定,則使用預設組。
- 通過配置 `spring.cloud.nacos.config. config[n].refresh` 來控制該配置集是否支援配置的動態重新整理。預設情況下不支援。
##### 控制層
使用 Spring 的 `@Value` 註解來獲取配置資訊,`${}` 中對應 Nacos 配置中心配置內容的 key,`:`後跟預設值。
並且通過 Spring Cloud 原生註解 `@RefreshScope` 實現配置自動更新。
```java
package org.example.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RefreshScope
@RestController
public class ConfigController {
@Value("${common.name:}")
private String commonName;
@Value("${global.name:}")
private String globalName;
@Value("${refresh.name:}")
private String refreshName;
@GetMapping("/extConfig")
public Map getExtConfig() {
Map configMap = new HashMap();
configMap.put("commonName", commonName);
configMap.put("globalName", globalName);
configMap.put("refreshName", refreshName);
return configMap;
}
}
```
##### 測試
訪問:http://localhost:7070/extConfig 結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b3e73f460?w=355&h=160&f=png&s=16328 " ")
### 共享配置集
通過共享配置集的方式也可以實現公共配置的功能,唯一的區別就是共享配置集無法設定組資訊,只獲取 DEFAULT_GROUP。具體實現方式如下:
```yaml
server:
port: 7070 # 埠
spring:
application:
name: product-service # 應用名稱
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
server-addr: 127.0.0.1:8848 # Nacos Server 地址
group: MALL_GROUP # 組,預設為 DEFAULT_GROUP
file-extension: yaml # 配置內容的資料格式,預設為 properties
namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 對應 dev 環境
# 共享配置集
shared-dataids: ext-config-common01.yaml,ext-config-common02.yaml,ext-config-common03.yaml # 多個配置集逗號隔開
refreshable-dataids: ext-config-common01.yaml # 哪個配置集支援動態重新整理
```
訪問:http://localhost:7070/extConfig 結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b5517fb43?w=359&h=161&f=png&s=12819 " ")
## 配置優先順序
Spring Cloud Alibaba Nacos Config 提供了三種從 Nacos 拉取配置的功能:
- A:通過內部相關規則(應用名、配置內容的資料格式等)自動生成相關的 Data Id 配置;
- B:通過配置 `spring.cloud.nacos.config.ext-config[n].data-id` 來支援多個配置集。同時配置多個配置集時,優先順序關係根據 `n` 的值決定,值越大,優先順序越高;
- C:通過配置 `spring.cloud.nacos.config.shared-dataids` 配置多個共享配置集;
當三種方式同時使用時,優先順序關係為:A > B > C。
## Nacos 叢集環境搭建
叢集模式跟我們平時進行擴容是一樣的,可以通過 Nginx 轉發到多個節點,如下圖:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b74242c6c?w=1098&h=324&f=jpeg&s=32568 " ")
如果為了方便省事,可以使用直連 ip 模式,配置中按如下編寫即可:
```yml
spring:
# 配置 Nacos 配置中心
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
server-addr: 192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848 # Nacos 伺服器地址
```
PS:如果只是為了學習的話直接在本地啟動 3 個例項,通過修改埠的方式即可。本文使用三臺伺服器的方式帶大家搭建環境,其實這種方式反而更簡單。
### 環境準備
Nacos 單節點,也就是我們剛才使用的 `standalone` 模式,預設使用嵌入式資料庫實現資料的儲存,不方便觀察資料儲存的基本情況,0.7 版本以後增加了支援 MySQL 資料來源能力。叢集搭建的時候我們需要將 Nacos 對接 Mysql 進行資料儲存。如果要搭建高可用的叢集環境,至少要滿足以下條件:
- JDK 1.8+;
- Maven 3.2.x+;
- MySQL 5.6.5+(生產使用建議至少主備模式,或者採用高可用資料庫);
- 3個或3個以上Nacos節點才能構成叢集。
### 下載原始碼或者安裝包
可以通過原始碼和發行包兩種方式來獲取 Nacos。
#### 原始碼方式
從 Github 上下載原始碼方式。
```shell
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
```
#### 發行包方式
您可以從 https://github.com/alibaba/nacos/releases 下載最新穩定版本的 `nacos-server` 包。
### 配置叢集配置檔案
將安裝包解壓。
```shell
tar -zxvf nacos-server-1.3.0.tar.gz -C /usr/local/ # 解壓檔案至 local 目錄
```
在 Nacos 的解壓目錄 `nacos/conf` 目錄下,複製配置檔案 `cluster.conf.example` 並重命名為 `cluster.conf`,每行配置成 `ip:port`。(請配置3個或3個以上節點)
```conf
192.168.10.101:8848
192.168.10.102:8848
192.168.10.103:8848
```
### 配置 MySQL 資料庫
Nacos 在 `0.7` 版本之前,預設使用的是嵌入式資料庫 `Apache Derby` 來儲存資料(內嵌的資料庫會隨著 Nacos 一起啟動,無需額外安裝);`0.7` 版本及以後,增加了對 `MySQL` 資料來源的支援。
### MySQL資料來源
環境要求:MySQL 5.6.5+(生產使用建議至少主備模式,或者採用高可用資料庫);
#### 初始化 MySQL 資料庫
建立資料庫 `nacos_config`。
SQL原始檔地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql ,或者在 `nacos-server` 解壓目錄 `conf` 下,找到 `nacos-mysql.sql` 檔案,執行該檔案,結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b5b41daf4?w=243&h=301&f=png&s=7546 " ")
#### application.properties 配置
修改 `nacos/conf/application.properties` 檔案的以下內容。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b780ab5ac?w=743&h=251&f=png&s=23245 " ")
最終修改結果如下:
```properties
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# 指定資料來源為 MySQL
spring.datasource.platform=mysql
### Count of DB:
# 資料庫例項數量
db.num=1
# 資料庫連線資訊,如果是 MySQL 8.0+ 版本需要新增 serverTimezone=Asia/Shanghai
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user=root
db.password=1234
```
> 如果你和我一樣使用的是 MySQL 8.0+ 版本,那麼啟動 Nacos 時肯定會報錯。莫慌,在 Nacos 安裝目錄下新建 `plugins/mysql` 資料夾,並放入 8.0+ 版本的 mysql-connector-java-8.0.xx.jar,重啟 Nacos 即可,啟動時會提示更換了 MySQL 的 driver-class 類。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b79045260?w=983&h=61&f=png&s=4426 " ")
### 啟動伺服器
#### Linux/Unix/Mac
在 Nacos 的解壓目錄 `nacos/bin` 目錄下啟動。
啟動命令(在沒有引數模式,是叢集模式):
```
sh startup.sh
```
### 檢視啟動記錄
可通過 `/nacos/logs/nacos.log`(詳細日誌)或 `/nacos/conf/start.out`(啟動記錄)的輸出內容檢視是否啟動成功。
檢視命令:
```shell
tail -f /usr/local/nacos/logs/start.out
```
啟動成功輸出結果:
```shell
2020-04-29 22:47:56,204 INFO Nacos is starting...
2020-04-29 22:47:56,556 INFO Nacos logs files: /usr/local/nacos/logs/
2020-04-29 22:47:56,556 INFO Nacos conf files: /usr/local/nacos/conf/
2020-04-29 22:47:56,556 INFO Nacos data files: /usr/local/nacos/data/
2020-04-29 22:47:56,556 INFO Nacos started successfully in cluster mode.
```
### 訪問
訪問以下連結,預設使用者名稱/密碼是 nacos/nacos :
- http://192.168.10.101:8848/nacos/
- http://192.168.10.102:8848/nacos/
- http://192.168.10.103:8848/nacos/
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b835723db?w=1059&h=591&f=png&s=99773 " ")
從下圖可以看到叢集節點共有三個,其中 `192.168.10.101:8848` 為 `leader`。
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b86ef092f?w=1362&h=433&f=png&s=32692 " ")
### 關閉伺服器
#### Linux/Unix/Mac
```
sh shutdown.sh
```
### 測試
#### 直連 ip 模式
##### 釋出配置
選擇 `配置管理` 的 `配置列表` 頁面,點選最右側 `+` 按鈕新建配置。
```text
Data ID: product-service.yaml
Group: DEFAULT_GROUP
Configuration format: YAML
Configuration content: project.name: SpringCloudAlibaba
project.org: Aliababa
```
##### 獲取配置
bootstrap.yml
```yaml
server:
port: 7070 # 埠
spring:
application:
name: product-service # 應用名稱
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
server-addr: 192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848 # Nacos 伺服器地址,叢集版直連 ip 模式
group: DEFAULT_GROUP # 組,預設為 DEFAULT_GROUP
file-extension: yaml # 配置內容的資料格式,預設為 properties
```
使用之前的控制層程式碼,訪問:http://localhost:7070/config 結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819dcaaf692?w=364&h=135&f=png&s=12259 " ")
#### Nginx 轉發
再啟動一臺伺服器 `192.168.10.100`,安裝 Nginx,配置代理轉發規則。
```shell
upstream nacos {
server 192.168.10.101:8848;
server 192.168.10.102:8848;
server 192.168.10.103:8848;
}
```
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb81b9657f05a?w=530&h=447&f=png&s=22822 " ")
##### 獲取配置
bootstrap.yml
```yaml
server:
port: 7070 # 埠
spring:
application:
name: product-service # 應用名稱
cloud:
nacos:
config:
enabled: true # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
server-addr: 192.168.10.100:80 # Nacos 伺服器地址,叢集版 Nginx 轉發
group: DEFAULT_GROUP # 組,預設為 DEFAULT_GROUP
file-extension: yaml # 配置內容的資料格式,預設為 properties
```
使用之前的控制層程式碼,訪問:http://localhost:7070/config 結果如下:
![](https://user-gold-cdn.xitu.io/2020/6/16/172bb819dcaaf692?w=364&h=135&f=png&s=12259 " ")
至此 Nacos 配置中心所有的知識點就講解結束了。
![](https://user-gold-cdn.xitu.io/2020/5/1/171cf87f564bc82e?w=433&h=133&f=gif&s=333013)
本文采用 `知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議`。
大家可以通過 `分類` 檢視更多關於 `Spring Cloud` 的文章。