Spring Cloud 系列之 Alibaba Nacos 配置中心

Nacos 介紹

Nacos 是 Alibaba 公司推出的開源工具,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置管理。英文全稱 Dynamic Naming and Configuration Service,Na 為 Naming/NameServer 即注冊中心,co 為 Configuration 即配置中心,Service 是指該注冊/配置中心都是以服務(wù)為核心。服務(wù)(Service)是 Nacos 世界的一等公民。

官網(wǎng)是這樣說的:一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)。

Nacos 致力于發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡單易用的特性集,可以快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。

Nacos 可以更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái)。 Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)的服務(wù)基礎(chǔ)設(shè)施。

使用 Nacos 簡化服務(wù)發(fā)現(xiàn)、配置管理、服務(wù)治理及管理的解決方案,讓微服務(wù)的發(fā)現(xiàn)、管理、共享、組合更加容易。

Nacos 官網(wǎng):https://nacos.io/zh-cn/

Github:https://github.com/alibaba/nacos

Nacos 安裝

環(huán)境準(zhǔn)備

Nacos 依賴 Java 環(huán)境來運(yùn)行。如果您是從代碼開始構(gòu)建并運(yùn)行 Nacos,還需要為此配置 Maven 環(huán)境,請確保是在以下版本環(huán)境中安裝使用:

  • JDK 1.8+;
  • Maven 3.2.x+。

下載源碼或者安裝包

可以通過源碼和發(fā)行包兩種方式來獲取 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

發(fā)行包方式

您可以從 https://github.com/alibaba/nacos/releases 下載最新穩(wěn)定版本的 nacos-server 包。

啟動(dòng)服務(wù)器

Linux/Unix/Mac

在 Nacos 的解壓目錄 nacos/bin 目錄下啟動(dòng)。

啟動(dòng)命令(standalone 代表著單機(jī)模式運(yùn)行,非集群模式):

sh startup.sh -m standalone

如果您使用的是 ubuntu 系統(tǒng),或者運(yùn)行腳本報(bào)錯(cuò)提示符號找不到,可嘗試如下運(yùn)行:

bash startup.sh -m standalone

Windows

啟動(dòng)命令:

cmd startup.cmd

或者雙擊 startup.cmd 運(yùn)行文件。

訪問

訪問:http://localhost:8848/nacos/ ,默認(rèn)用戶名/密碼是 nacos/nacos。

關(guān)閉服務(wù)器

Linux/Unix/Mac

sh shutdown.sh

Windows

cmd shutdown.cmd

或者雙擊 shutdown.cmd 運(yùn)行文件。

配置 MySQL 數(shù)據(jù)庫

Nacos 在 0.7 版本之前,默認(rèn)使用的是嵌入式數(shù)據(jù)庫 Apache Derby 來存儲(chǔ)數(shù)據(jù)(內(nèi)嵌的數(shù)據(jù)庫會(huì)隨著 Nacos 一起啟動(dòng),無需額外安裝);0.7 版本及以后,增加了對 MySQL 數(shù)據(jù)源的支持。

MySQL數(shù)據(jù)源

環(huán)境要求:MySQL 5.6.5+(生產(chǎn)使用建議至少主備模式,或者采用高可用數(shù)據(jù)庫);

初始化 MySQL 數(shù)據(jù)庫

創(chuàng)建數(shù)據(jù)庫 nacos_config

SQL源文件地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql ,或者在 nacos-server 解壓目錄 conf 下,找到 nacos-mysql.sql 文件,運(yùn)行該文件,結(jié)果如下:

application.properties 配置

修改 nacos/conf/application.properties 文件的以下內(nèi)容。

最終修改結(jié)果如下:

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# 指定數(shù)據(jù)源為 MySQL
spring.datasource.platform=mysql

### Count of DB:
# 數(shù)據(jù)庫實(shí)例數(shù)量
db.num=1

# 數(shù)據(jù)庫連接信息,如果是 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+ 版本,那么啟動(dòng) Nacos 時(shí)肯定會(huì)報(bào)錯(cuò)。莫慌,在 Nacos 安裝目錄下新建 plugins/mysql 文件夾,并放入 8.0+ 版本的 mysql-connector-java-8.0.xx.jar,重啟 Nacos 即可,啟動(dòng)時(shí)會(huì)提示更換了 MySQL 的 driver-class 類。

Nacos 配置入門

nacos-config-demo 聚合工程。SpringBoot 2.3.0.RELEASESpring Cloud Hoxton.SR5

發(fā)布配置

選擇 配置管理配置列表 頁面,點(diǎn)擊最右側(cè) + 按鈕新建配置。

Nacos Config 使用 Data IDGroup 來確定配置。

下圖顯示 Data Idproduct-service.yaml,組使用默認(rèn)組,并添加 yaml 格式的配置信息。

project:
  name: SpringCloudAlibaba
  org: Aliababa

獲取配置

創(chuàng)建項(xiàng)目

我們創(chuàng)建聚合項(xiàng)目來講解 Nacos,首先創(chuàng)建一個(gè) 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>

    <!-- 項(xiàng)目坐標(biāo)地址 -->
    <groupId>org.example</groupId>
    <!-- 項(xiàng)目模塊名稱 -->
    <artifactId>nacos-config-demo</artifactId>
    <!-- 項(xiàng)目版本名稱 快照版本SNAPSHOT、正式版本RELEASE -->
    <version>1.0-SNAPSHOT</version>

    <!-- 繼承 spring-boot-starter-parent 依賴 -->
    <!-- 使用繼承方式,實(shí)現(xiàn)復(fù)用,符合繼承的都可以被使用 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
    </parent>

    <!--
        集中定義依賴組件版本號,但不引入,
        在子工程中用到聲明的依賴時(shí),可以不加依賴的版本號,
        這樣可以統(tǒng)一管理工程中用到的依賴版本
     -->
    <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>

    <!-- 項(xiàng)目依賴管理 父項(xiàng)目只是聲明依賴,子項(xiàng)目需要寫明需要的依賴(可以省略版本信息) -->
    <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>

商品服務(wù) product-service

創(chuàng)建項(xiàng)目

在剛才的父工程下創(chuàng)建一個(gè) product-service 項(xiàng)目。

添加依賴

主要添加 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>

    <!-- 項(xiàng)目依賴 -->
    <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 的地址和應(yīng)用名。

server:
  port: 7070 # 端口

spring:
  application:
    name: product-service # 應(yīng)用名稱
  cloud:
    nacos:
      config:
        enabled: true # 如果不想使用 Nacos 進(jìn)行配置管理,設(shè)置為 false 即可
        server-addr: 127.0.0.1:8848 # Nacos Server 地址
        group: DEFAULT_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
        file-extension: yaml # 配置內(nèi)容的數(shù)據(jù)格式,默認(rèn)為 properties

說明:之所以需要配置 spring.application.name,是因?yàn)樗菢?gòu)成 Nacos 配置管理 dataId字段的一部分。

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默認(rèn)為 spring.application.name 的值,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置。
  • spring.profile.active 即為當(dāng)前環(huán)境對應(yīng)的 profile。注意:當(dāng) spring.profile.active 為空時(shí),對應(yīng)的連接符 - 也將不存在,dataId 的拼接格式將變成 ${prefix}.${file-extension}
  • file-exetension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項(xiàng) spring.cloud.nacos.config.file-extension 來配置。目前只支持 propertiesyaml 類型,默認(rèn)為 properties
控制層

使用 Spring 的 @Value 注解來獲取配置信息,${} 中對應(yīng) Nacos 配置中心配置內(nèi)容的 key,:后跟默認(rèn)值。

并且通過 Spring Cloud 原生注解 @RefreshScope 實(shí)現(xiàn)配置自動(dòng)更新。

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;
    }

}
啟動(dòng)類
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 結(jié)果如下:

修改配置為以下內(nèi)容,重新發(fā)布:

project:
  name: SpringCloudAlibaba-Nacos
  org: Aliababa

控制臺(tái)打印信息如下:

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 結(jié)果如下:

Nacos 配置核心概念

配置

為什么需要配置?概念。

在系統(tǒng)開發(fā)過程中,開發(fā)者通常會(huì)將一些需要變更的參數(shù)、變量等從代碼中分離出來獨(dú)立管理,以獨(dú)立的配置文件的形式存在。目的是讓靜態(tài)的系統(tǒng)工件或者交付物(如 WAR,JAR 包等)更好地和實(shí)際的物理運(yùn)行環(huán)境進(jìn)行適配。配置管理一般包含在系統(tǒng)部署的過程中,由系統(tǒng)管理員或者運(yùn)維人員完成。配置變更是調(diào)整系統(tǒng)運(yùn)行時(shí)的行為的有效手段。

配置管理

對配置的多維度管理。

系統(tǒng)配置的編輯、存儲(chǔ)、分發(fā)、變更管理、歷史版本管理、變更審計(jì)等所有與配置相關(guān)的活動(dòng)。

配置項(xiàng)

一個(gè)鍵值對 Key = Value。

一個(gè)具體的可配置的參數(shù)與其值域(一個(gè)鍵值對),通常以 param-key=param-value 的形式存在。例如我們常配置系統(tǒng)的日志輸出級別(logLevel=INFO|WARN|ERROR) 就是一個(gè)配置項(xiàng)。

配置集

多個(gè)鍵值對,一般指一個(gè)配置文件。

一組相關(guān)或者不相關(guān)的配置項(xiàng)的集合稱為配置集(多個(gè)鍵值對/一個(gè)配置文件)。在系統(tǒng)中,一個(gè)配置文件通常就是一個(gè)配置集,包含了系統(tǒng)各個(gè)方面的配置。例如,一個(gè)配置集可能包含了數(shù)據(jù)源、線程池、日志級別等配置項(xiàng)。

配置集 ID

給這個(gè)配置文件起一個(gè)全局唯一的 ID。

Nacos 中的某個(gè)配置集的 ID。配置集 ID 是組織劃分配置的維度之一。Data ID 通常用于組織劃分系統(tǒng)的配置集。一個(gè)系統(tǒng)或者應(yīng)用可以包含多個(gè)配置集,每個(gè)配置集都可以被一個(gè)有意義的名稱標(biāo)識(shí)。Data ID 通常采用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規(guī)則保證全局唯一性。此命名規(guī)則非強(qiáng)制。

配置分組

多個(gè)配置文件放在一起,形成組,一般用于區(qū)分項(xiàng)目。例如,某學(xué)校多應(yīng)用之間的區(qū)分,教師應(yīng)用 TEACHER_GROUP,學(xué)生應(yīng)用 STUDENT_GROUP。

Nacos 中的一組配置集,是組織配置的維度之一。通過一個(gè)有意義的字符串(如 Buy 或 Trade )對配置集進(jìn)行分組,從而區(qū)分 Data ID 相同的配置集。當(dāng)您在 Nacos 上創(chuàng)建一個(gè)配置時(shí),如果未填寫配置分組的名稱,則配置分組的名稱默認(rèn)采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應(yīng)用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。

配置快照

緩存配置信息。

Nacos 的客戶端 SDK 會(huì)在本地生成配置的快照。當(dāng)客戶端無法連接到 Nacos Server 時(shí),可以使用配置快照顯示系統(tǒng)的整體容災(zāi)能力。配置快照類似于 Git 中的本地 commit,也類似于緩存,會(huì)在適當(dāng)?shù)臅r(shí)機(jī)更新,但是并沒有緩存過期(expiration)的概念。

命名空間

區(qū)分環(huán)境,比如:dev、test、prod 等等。

用于進(jìn)行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環(huán)境的配置的區(qū)分隔離,例如開發(fā)測試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務(wù))隔離等。

最佳實(shí)踐

通常我們可以這樣定義 Namespace,Group,DataId:

  • Namespace:代表不同的環(huán)境,如:開發(fā)、測試, 生產(chǎn)等;
  • Group:代表某個(gè)項(xiàng)目,如:XX物流項(xiàng)目,XX教育項(xiàng)目;
  • DataId:每個(gè)項(xiàng)目下往往有若干個(gè)應(yīng)用,每個(gè)配置集(DataId)是一個(gè)應(yīng)用的主配置文件

Namespace 命名空間

前面已經(jīng)介紹過命名空間的概念,用于隔離多個(gè)環(huán)境,而每個(gè)應(yīng)用在不同環(huán)境的同一個(gè)配置(如數(shù)據(jù)庫數(shù)據(jù)源)的值是不一樣的。因此,我們針對企業(yè)項(xiàng)目實(shí)際研發(fā)流程和環(huán)境進(jìn)行規(guī)劃。

如某軟件公司擁有開發(fā)、測試、生產(chǎn)三套環(huán)境,那么我們應(yīng)該建立三個(gè) Namespace 進(jìn)行區(qū)分。

創(chuàng)建命名空間

點(diǎn)擊左側(cè)菜單 命名空間,看到默認(rèn)有一個(gè) public(保留空間),點(diǎn)擊右側(cè) 新建命名空間進(jìn)行創(chuàng)建。

按下圖的方式分別創(chuàng)建 dev(開發(fā)環(huán)境)test(測試環(huán)境)prod(生產(chǎn)環(huán)境) 三個(gè)命名空間。

最終結(jié)果如下:

指定命名空間

如果 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 控制臺(tái)中檢索 ID 的值。 添加配置時(shí),請勿選擇其他名稱空間。 否則,將無法正確檢索配置。

發(fā)布配置

選擇 配置管理配置列表 頁面,選擇 dev 環(huán)境,點(diǎn)擊最右側(cè) + 按鈕新建配置。

Nacos Config 使用 Data IDGroup 來確定配置。

下圖顯示 Data Idproduct-service.yaml,組使用默認(rèn)組,并添加 yaml 格式的配置信息。

project:
  name: SpringCloudAlibaba-DEV
  org: Aliababa

獲取配置

配置文件

bootstrap.yml

server:
  port: 7070 # 端口

spring:
  application:
    name: product-service # 應(yīng)用名稱
  cloud:
    nacos:
      config:
        enabled: true # 如果不想使用 Nacos 進(jìn)行配置管理,設(shè)置為 false 即可
        server-addr: 127.0.0.1:8848 # Nacos Server 地址
        group: DEFAULT_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
        file-extension: yaml # 配置內(nèi)容的數(shù)據(jù)格式,默認(rèn)為 properties
        namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 對應(yīng) dev 環(huán)境

控制層

使用 Spring 的 @Value 注解來獲取配置信息,${} 中對應(yīng) Nacos 配置中心配置內(nèi)容的 key,:后跟默認(rèn)值。

并且通過 Spring Cloud 原生注解 @RefreshScope 實(shí)現(xiàn)配置自動(dòng)更新。

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 結(jié)果如下:

Group 組

Group 組信息可以在新建配置時(shí)進(jìn)行指定,如下圖:

配置管理

這一小節(jié)我們通過大量配圖演示控制臺(tái)的相關(guān)操作。

新建/編輯/刪除/查詢

右側(cè) + 新建配置。單條編輯或刪除選擇操作欄中的編輯或刪除。批量刪除勾選以后選擇左下角紅色刪除。

可以通過 Data IdGroup 查詢配置,還可以將查詢結(jié)果導(dǎo)出。

導(dǎo)入/導(dǎo)出/克隆

前文提到命名空間用于隔離多個(gè)環(huán)境,每個(gè)應(yīng)用在不同環(huán)境的同一個(gè)配置(如數(shù)據(jù)庫數(shù)據(jù)源)的值是不一樣的。也就是說可能大量的配置項(xiàng)都是相同的,個(gè)別差異的配置項(xiàng)需要額外修改,在這種情況下,如果一條條重新添加肯定非常不友好,我們可以通過導(dǎo)入導(dǎo)出功能實(shí)現(xiàn)。

比如,我們將 dev 環(huán)境下的配置先全選導(dǎo)出。

然后在 test 環(huán)境中導(dǎo)入,文件上傳后將直接導(dǎo)入配置,請務(wù)必謹(jǐn)慎操作!

通過克隆也可以達(dá)到相同的效果,不同的是克隆可以額外修改 Data IdGroup 信息。

歷史/回滾

選擇 配置管理歷史版本 頁面,通過 Data IdGroup 查詢歷史,可以查看每個(gè)歷史版本的詳情,或選擇回滾至該版本。

監(jiān)聽查詢

Nacos 提供配置訂閱者,也就是監(jiān)聽者查詢能力,同時(shí)提供客戶端當(dāng)前配置的 MD5 校驗(yàn)值,以便幫助用戶更好的檢查配置變更以后是否推送到 Client 端。

選擇 配置管理監(jiān)聽查詢 頁面,通過 配置或IPData IdGroup 查詢。

權(quán)限控制

Nacos 提供了基于 RBAC 的權(quán)限控制,通過左側(cè) 權(quán)限控制 菜單的 用戶列表角色管理權(quán)限管理實(shí)現(xiàn),可以算是傻瓜式操作了,鼠標(biāo)多點(diǎn)幾下就會(huì)了。

公共配置

每個(gè)配置集對應(yīng)一個(gè)應(yīng)用,但是開發(fā)時(shí)我們可能會(huì)有一些公共配置被多個(gè)應(yīng)用使用,這時(shí)候就需要擴(kuò)展配置集或共享配置集來實(shí)現(xiàn)了。

擴(kuò)展配置集

我們先創(chuàng)建三個(gè)配置集,如下:

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 # 應(yīng)用名稱
  cloud:
    nacos:
      config:
        enabled: true # 如果不想使用 Nacos 進(jìn)行配置管理,設(shè)置為 false 即可
        server-addr: 127.0.0.1:8848 # Nacos Server 地址
        group: MALL_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
        file-extension: yaml # 配置內(nèi)容的數(shù)據(jù)格式,默認(rèn)為 properties
        namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 對應(yīng) dev 環(huán)境
        # 擴(kuò)展配置集
        ext-config[0]:
          data-id: ext-config-common01.yaml # 配置集 id
        ext-config[1]:
          data-id: ext-config-common02.yaml # 配置集 id
          group: GLOBAL_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
        ext-config[2]:
          data-id: ext-config-common03.yaml # 配置集 id
          group: REFRESH_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
          refresh: true # 是否支持動(dòng)態(tài)刷新

總結(jié):

  • 通過配置 spring.cloud.nacos.config.ext-config[n].data-id 來支持多個(gè)配置集。
  • 通過配置 spring.cloud.nacos.config.ext-config[n].group 來定制配置組。如果未指定,則使用默認(rèn)組。
  • 通過配置 spring.cloud.nacos.config. config[n].refresh 來控制該配置集是否支持配置的動(dòng)態(tài)刷新。默認(rèn)情況下不支持。
控制層

使用 Spring 的 @Value 注解來獲取配置信息,${} 中對應(yīng) Nacos 配置中心配置內(nèi)容的 key,:后跟默認(rèn)值。

并且通過 Spring Cloud 原生注解 @RefreshScope 實(shí)現(xiàn)配置自動(dòng)更新。

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 結(jié)果如下:

共享配置集

通過共享配置集的方式也可以實(shí)現(xiàn)公共配置的功能,唯一的區(qū)別就是共享配置集無法設(shè)置組信息,只獲取 DEFAULT_GROUP。具體實(shí)現(xiàn)方式如下:

server:
  port: 7070 # 端口

spring:
  application:
    name: product-service # 應(yīng)用名稱
  cloud:
    nacos:
      config:
        enabled: true # 如果不想使用 Nacos 進(jìn)行配置管理,設(shè)置為 false 即可
        server-addr: 127.0.0.1:8848 # Nacos Server 地址
        group: MALL_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
        file-extension: yaml # 配置內(nèi)容的數(shù)據(jù)格式,默認(rèn)為 properties
        namespace: 450a3f07-08ee-49f6-8213-9b04b06cd3cc # 對應(yīng) dev 環(huán)境
        # 共享配置集
        shared-dataids: ext-config-common01.yaml,ext-config-common02.yaml,ext-config-common03.yaml # 多個(gè)配置集逗號隔開
        refreshable-dataids: ext-config-common01.yaml # 哪個(gè)配置集支持動(dòng)態(tài)刷新

訪問:http://localhost:7070/extConfig 結(jié)果如下:

配置優(yōu)先級

Spring Cloud Alibaba Nacos Config 提供了三種從 Nacos 拉取配置的功能:

  • A:通過內(nèi)部相關(guān)規(guī)則(應(yīng)用名、配置內(nèi)容的數(shù)據(jù)格式等)自動(dòng)生成相關(guān)的 Data Id 配置;
  • B:通過配置 spring.cloud.nacos.config.ext-config[n].data-id 來支持多個(gè)配置集。同時(shí)配置多個(gè)配置集時(shí),優(yōu)先級關(guān)系根據(jù) n 的值決定,值越大,優(yōu)先級越高;
  • C:通過配置 spring.cloud.nacos.config.shared-dataids 配置多個(gè)共享配置集;

當(dāng)三種方式同時(shí)使用時(shí),優(yōu)先級關(guān)系為:A > B > C。

Nacos 集群環(huán)境搭建

集群模式跟我們平時(shí)進(jìn)行擴(kuò)容是一樣的,可以通過 Nginx 轉(zhuǎn)發(fā)到多個(gè)節(jié)點(diǎn),如下圖:

如果為了方便省事,可以使用直連 ip 模式,配置中按如下編寫即可:

spring:
  # 配置 Nacos 配置中心
  cloud:
    nacos:
      config:
        enabled: true # 如果不想使用 Nacos 進(jìn)行配置管理,設(shè)置為 false 即可
        server-addr: 192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848 # Nacos 服務(wù)器地址

PS:如果只是為了學(xué)習(xí)的話直接在本地啟動(dòng) 3 個(gè)實(shí)例,通過修改端口的方式即可。本文使用三臺(tái)服務(wù)器的方式帶大家搭建環(huán)境,其實(shí)這種方式反而更簡單。

環(huán)境準(zhǔn)備

Nacos 單節(jié)點(diǎn),也就是我們剛才使用的 standalone 模式,默認(rèn)使用嵌入式數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),不方便觀察數(shù)據(jù)存儲(chǔ)的基本情況,0.7 版本以后增加了支持 MySQL 數(shù)據(jù)源能力。集群搭建的時(shí)候我們需要將 Nacos 對接 Mysql 進(jìn)行數(shù)據(jù)存儲(chǔ)。如果要搭建高可用的集群環(huán)境,至少要滿足以下條件:

  • JDK 1.8+;
  • Maven 3.2.x+;
  • MySQL 5.6.5+(生產(chǎn)使用建議至少主備模式,或者采用高可用數(shù)據(jù)庫);
  • 3個(gè)或3個(gè)以上Nacos節(jié)點(diǎn)才能構(gòu)成集群。

下載源碼或者安裝包

可以通過源碼和發(fā)行包兩種方式來獲取 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

發(fā)行包方式

您可以從 https://github.com/alibaba/nacos/releases 下載最新穩(wěn)定版本的 nacos-server 包。

配置集群配置文件

將安裝包解壓。

tar -zxvf nacos-server-1.3.0.tar.gz -C /usr/local/ # 解壓文件至 local 目錄

在 Nacos 的解壓目錄 nacos/conf 目錄下,復(fù)制配置文件 cluster.conf.example 并重命名為 cluster.conf,每行配置成 ip:port。(請配置3個(gè)或3個(gè)以上節(jié)點(diǎn))

192.168.10.101:8848
192.168.10.102:8848
192.168.10.103:8848

配置 MySQL 數(shù)據(jù)庫

Nacos 在 0.7 版本之前,默認(rèn)使用的是嵌入式數(shù)據(jù)庫 Apache Derby 來存儲(chǔ)數(shù)據(jù)(內(nèi)嵌的數(shù)據(jù)庫會(huì)隨著 Nacos 一起啟動(dòng),無需額外安裝);0.7 版本及以后,增加了對 MySQL 數(shù)據(jù)源的支持。

MySQL數(shù)據(jù)源

環(huán)境要求:MySQL 5.6.5+(生產(chǎn)使用建議至少主備模式,或者采用高可用數(shù)據(jù)庫);

初始化 MySQL 數(shù)據(jù)庫

創(chuàng)建數(shù)據(jù)庫 nacos_config

SQL源文件地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql ,或者在 nacos-server 解壓目錄 conf 下,找到 nacos-mysql.sql 文件,運(yùn)行該文件,結(jié)果如下:

application.properties 配置

修改 nacos/conf/application.properties 文件的以下內(nèi)容。

最終修改結(jié)果如下:

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# 指定數(shù)據(jù)源為 MySQL
spring.datasource.platform=mysql

### Count of DB:
# 數(shù)據(jù)庫實(shí)例數(shù)量
db.num=1

# 數(shù)據(jù)庫連接信息,如果是 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+ 版本,那么啟動(dòng) Nacos 時(shí)肯定會(huì)報(bào)錯(cuò)。莫慌,在 Nacos 安裝目錄下新建 plugins/mysql 文件夾,并放入 8.0+ 版本的 mysql-connector-java-8.0.xx.jar,重啟 Nacos 即可,啟動(dòng)時(shí)會(huì)提示更換了 MySQL 的 driver-class 類。

啟動(dòng)服務(wù)器

Linux/Unix/Mac

在 Nacos 的解壓目錄 nacos/bin 目錄下啟動(dòng)。

啟動(dòng)命令(在沒有參數(shù)模式,是集群模式):

sh startup.sh

查看啟動(dòng)記錄

可通過 /nacos/logs/nacos.log(詳細(xì)日志)或 /nacos/conf/start.out(啟動(dòng)記錄)的輸出內(nèi)容查看是否啟動(dòng)成功。

查看命令:

tail -f /usr/local/nacos/logs/start.out

啟動(dòng)成功輸出結(jié)果:

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.

訪問

訪問以下鏈接,默認(rèn)用戶名/密碼是 nacos/nacos :

從下圖可以看到集群節(jié)點(diǎn)共有三個(gè),其中 192.168.10.101:8848leader

關(guān)閉服務(wù)器

Linux/Unix/Mac

sh shutdown.sh

測試

直連 ip 模式

發(fā)布配置

選擇 配置管理配置列表 頁面,點(diǎn)擊最右側(cè) + 按鈕新建配置。

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 # 應(yīng)用名稱
  cloud:
    nacos:
      config:
        enabled: true # 如果不想使用 Nacos 進(jìn)行配置管理,設(shè)置為 false 即可
        server-addr: 192.168.10.101:8848,192.168.10.102:8848,192.168.10.103:8848 # Nacos 服務(wù)器地址,集群版直連 ip 模式
        group: DEFAULT_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
        file-extension: yaml # 配置內(nèi)容的數(shù)據(jù)格式,默認(rèn)為 properties

使用之前的控制層代碼,訪問:http://localhost:7070/config 結(jié)果如下:

Nginx 轉(zhuǎn)發(fā)

再啟動(dòng)一臺(tái)服務(wù)器 192.168.10.100,安裝 Nginx,配置代理轉(zhuǎn)發(fā)規(guī)則。

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 # 應(yīng)用名稱
  cloud:
    nacos:
      config:
        enabled: true # 如果不想使用 Nacos 進(jìn)行配置管理,設(shè)置為 false 即可
        server-addr: 192.168.10.100:80 # Nacos 服務(wù)器地址,集群版 Nginx 轉(zhuǎn)發(fā)
        group: DEFAULT_GROUP # 組,默認(rèn)為 DEFAULT_GROUP
        file-extension: yaml # 配置內(nèi)容的數(shù)據(jù)格式,默認(rèn)為 properties

使用之前的控制層代碼,訪問:http://localhost:7070/config 結(jié)果如下:

至此 Nacos 配置中心所有的知識(shí)點(diǎn)就講解結(jié)束了。

本文采用 知識(shí)共享「署名-非商業(yè)性使用-禁止演繹 4.0 國際」許可協(xié)議

大家可以通過 分類 查看更多關(guān)于 Spring Cloud 的文章。


?? 您的點(diǎn)贊轉(zhuǎn)發(fā)是對我最大的支持。

?? 關(guān)注公眾號 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學(xué)習(xí)更輕松噢 ~


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。