Nacos 介紹
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 上下載源碼方式。
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 代表着單機模式運行,非集群模式):
sh startup.sh -m standalone
如果您使用的是 ubuntu 系統,或者運行腳本報錯提示符號找不到,可嘗試如下運行:
bash startup.sh -m standalone
Windows
啟動命令:
cmd startup.cmd
或者雙擊 startup.cmd
運行文件。
訪問
訪問:http://localhost:8848/nacos/ ,默認用戶名/密碼是 nacos/nacos。
關閉服務器
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
文件,運行該文件,結果如下:
application.properties 配置
修改 nacos/conf/application.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 類。
Nacos 配置入門
nacos-config-demo
聚合工程。SpringBoot 2.3.0.RELEASE
、Spring Cloud Hoxton.SR5
。
發布配置
選擇 配置管理
的 配置列表
頁面,點擊最右側 +
按鈕新建配置。
Nacos Config 使用 Data ID
和 Group
來確定配置。
下圖顯示 Data Id
為 product-service.yaml
,組使用默認組,並添加 yaml
格式的配置信息。
project:
name: SpringCloudAlibaba
org: Aliababa
獲取配置
創建項目
我們創建聚合項目來講解 Nacos,首先創建一個 pom 父工程。
添加依賴
pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 項目坐標地址 -->
<groupId>org.example</groupId>
<!-- 項目模塊名稱 -->
<artifactId>nacos-config-demo</artifactId>
<!-- 項目版本名稱 快照版本SNAPSHOT、正式版本RELEASE -->
<version>1.0-SNAPSHOT</version>
<!-- 繼承 spring-boot-starter-parent 依賴 -->
<!-- 使用繼承方式,實現復用,符合繼承的都可以被使用 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<!--
集中定義依賴組件版本號,但不引入,
在子工程中用到聲明的依賴時,可以不加依賴的版本號,
這樣可以統一管理工程中用到的依賴版本
-->
<properties>
<!-- Spring Cloud Hoxton.SR5 依賴 -->
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
<!-- spring cloud alibaba 依賴 -->
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<!-- 項目依賴管理 父項目只是聲明依賴,子項目需要寫明需要的依賴(可以省略版本信息) -->
<dependencyManagement>
<dependencies>
<!-- spring cloud 依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依賴 -->
<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>
</project>
商品服務 product-service
創建項目
在剛才的父工程下創建一個 product-service
項目。
添加依賴
主要添加 spring-cloud-starter-alibaba-nacos-config
依賴。
<!-- spring cloud alibaba nacos config 依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
完整依賴如下:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 繼承父依賴 -->
<parent>
<artifactId>nacos-config-demo</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>product-service</artifactId>
<!-- 項目依賴 -->
<dependencies>
<!-- spring cloud alibaba nacos config 依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- spring boot web 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok 依賴 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- spring boot test 依賴 -->
<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>
</dependencies>
</project>
配置文件
在 bootstrap.yml
中配置 Nacos Server 的地址和應用名。
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
的完整格式如下:
${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
實現配置自動更新。
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<String, Object> getConfig() {
Map<String, Object> configMap = new HashMap();
configMap.put("projectName", projectName);
configMap.put("projectOrg", projectOrg);
return configMap;
}
}
啟動類
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 結果如下:
修改配置為以下內容,重新發布:
project:
name: SpringCloudAlibaba-Nacos
org: Aliababa
控制台打印信息如下:
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 結果如下:
Nacos 配置核心概念
配置
為什么需要配置?概念。
在系統開發過程中,開發者通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 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)是一個應用的主配置文件
Namespace 命名空間
前面已經介紹過命名空間的概念,用於隔離多個環境,而每個應用在不同環境的同一個配置(如數據庫數據源)的值是不一樣的。因此,我們針對企業項目實際研發流程和環境進行規划。
如某軟件公司擁有開發、測試、生產三套環境,那么我們應該建立三個 Namespace 進行區分。
創建命名空間
點擊左側菜單 命名空間
,看到默認有一個 public(保留空間)
,點擊右側 新建命名空間
進行創建。
按下圖的方式分別創建 dev(開發環境)
、test(測試環境)
、prod(生產環境)
三個命名空間。
最終結果如下:
指定命名空間
如果 spring.cloud.nacos.config.namespace
中沒有指定名稱空間,則使用 Nacos 的 public(保留空間)。還可以按以下方式指定自定義名稱空間:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
此配置必須在 bootstrap.yml 文件中。 spring.cloud.nacos.config.namespace 的值是命名空間的 ID,可以從 Nacos 控制台中檢索 ID 的值。 添加配置時,請勿選擇其他名稱空間。 否則,將無法正確檢索配置。
發布配置
選擇 配置管理
的 配置列表
頁面,選擇 dev
環境,點擊最右側 +
按鈕新建配置。
Nacos Config 使用 Data ID
和 Group
來確定配置。
下圖顯示 Data Id
為 product-service.yaml
,組使用默認組,並添加 yaml
格式的配置信息。
project:
name: SpringCloudAlibaba-DEV
org: Aliababa
獲取配置
配置文件
bootstrap.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
實現配置自動更新。
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<String, Object> getConfig() {
Map<String, Object> configMap = new HashMap();
configMap.put("projectName", projectName);
configMap.put("projectOrg", projectOrg);
return configMap;
}
}
測試
訪問:http://localhost:7070/config 結果如下:
Group 組
Group 組信息可以在新建配置時進行指定,如下圖:
配置管理
這一小節我們通過大量配圖演示控制台的相關操作。
新建/編輯/刪除/查詢
右側 +
新建配置。單條編輯或刪除選擇操作欄中的編輯或刪除。批量刪除勾選以后選擇左下角紅色刪除。
可以通過 Data Id
和 Group
查詢配置,還可以將查詢結果導出。
導入/導出/克隆
前文提到命名空間用於隔離多個環境,每個應用在不同環境的同一個配置(如數據庫數據源)的值是不一樣的。也就是說可能大量的配置項都是相同的,個別差異的配置項需要額外修改,在這種情況下,如果一條條重新添加肯定非常不友好,我們可以通過導入導出功能實現。
比如,我們將 dev
環境下的配置先全選導出。
然后在 test
環境中導入,文件上傳后將直接導入配置,請務必謹慎操作!
通過克隆也可以達到相同的效果,不同的是克隆可以額外修改 Data Id
和 Group
信息。
歷史/回滾
選擇 配置管理
的 歷史版本
頁面,通過 Data Id
和 Group
查詢歷史,可以查看每個歷史版本的詳情,或選擇回滾至該版本。
監聽查詢
Nacos 提供配置訂閱者,也就是監聽者查詢能力,同時提供客戶端當前配置的 MD5 校驗值,以便幫助用戶更好的檢查配置變更以后是否推送到 Client 端。
選擇 配置管理
的 監聽查詢
頁面,通過 配置或IP
、Data Id
和 Group
查詢。
權限控制
Nacos 提供了基於 RBAC 的權限控制,通過左側 權限控制
菜單的 用戶列表
、角色管理
、權限管理
實現,可以算是傻瓜式操作了,鼠標多點幾下就會了。
公共配置
每個配置集對應一個應用,但是開發時我們可能會有一些公共配置被多個應用使用,這時候就需要擴展配置集或共享配置集來實現了。
擴展配置集
我們先創建三個配置集,如下:
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
獲取配置
配置文件
bootstrap.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: 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
實現配置自動更新。
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<String, Object> getExtConfig() {
Map<String, Object> configMap = new HashMap();
configMap.put("commonName", commonName);
configMap.put("globalName", globalName);
configMap.put("refreshName", refreshName);
return configMap;
}
}
測試
訪問:http://localhost:7070/extConfig 結果如下:
共享配置集
通過共享配置集的方式也可以實現公共配置的功能,唯一的區別就是共享配置集無法設置組信息,只獲取 DEFAULT_GROUP。具體實現方式如下:
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 結果如下:
配置優先級
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 轉發到多個節點,如下圖:
如果為了方便省事,可以使用直連 ip 模式,配置中按如下編寫即可:
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 上下載源碼方式。
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
包。
配置集群配置文件
將安裝包解壓。
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個以上節點)
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
文件,運行該文件,結果如下:
application.properties 配置
修改 nacos/conf/application.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 類。
啟動服務器
Linux/Unix/Mac
在 Nacos 的解壓目錄 nacos/bin
目錄下啟動。
啟動命令(在沒有參數模式,是集群模式):
sh startup.sh
查看啟動記錄
可通過 /nacos/logs/nacos.log
(詳細日志)或 /nacos/conf/start.out
(啟動記錄)的輸出內容查看是否啟動成功。
查看命令:
tail -f /usr/local/nacos/logs/start.out
啟動成功輸出結果:
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/
從下圖可以看到集群節點共有三個,其中 192.168.10.101:8848
為 leader
。
關閉服務器
Linux/Unix/Mac
sh shutdown.sh
測試
直連 ip 模式
發布配置
選擇 配置管理
的 配置列表
頁面,點擊最右側 +
按鈕新建配置。
Data ID: product-service.yaml
Group: DEFAULT_GROUP
Configuration format: YAML
Configuration content: project.name: SpringCloudAlibaba
project.org: Aliababa
獲取配置
bootstrap.yml
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 結果如下:
Nginx 轉發
再啟動一台服務器 192.168.10.100
,安裝 Nginx,配置代理轉發規則。
upstream nacos {
server 192.168.10.101:8848;
server 192.168.10.102:8848;
server 192.168.10.103:8848;
}
獲取配置
bootstrap.yml
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 結果如下:
至此 Nacos 配置中心所有的知識點就講解結束了。
本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議
。
大家可以通過 分類
查看更多關於 Spring Cloud
的文章。
🤗 您的點贊
和轉發
是對我最大的支持。
📢 掃碼關注 哈嘍沃德先生
「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕松噢 ~