个人 二维码




公众号二维码

目录

Spring Cloud 系列之 Alibaba Nacos 配置中心

Nacos 介绍

  

/resources/articles/spring/spring-cloud/nacos-config/nacos.png

  

  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 上下载源码方式。

1
2
3
4
5
6
7
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 代表着单机模式运行,非集群模式):

1
sh startup.sh -m standalone

  如果您使用的是 ubuntu 系统,或者运行脚本报错提示符号找不到,可尝试如下运行:

1
bash startup.sh -m standalone

  

Windows

  

  启动命令:

1
cmd startup.cmd

  或者双击 startup.cmd 运行文件。

  

访问

  

  访问:http://localhost:8848/nacos/ ,默认用户名/密码是 nacos/nacos。

/resources/articles/spring/spring-cloud/nacos-config/image-20200429142118555.png

/resources/articles/spring/spring-cloud/nacos-config/image-20200612120430910.png

  

关闭服务器

  

Linux/Unix/Mac

  

1
sh shutdown.sh

  

Windows

  

1
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 文件,运行该文件,结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200429220641953.png

  

application.properties 配置

  

  修改 nacos/conf/application.properties 文件的以下内容。

/resources/articles/spring/spring-cloud/nacos-config/image-20200429181636359.png

  最终修改结果如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#*************** 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 类。

/resources/articles/spring/spring-cloud/nacos-config/image-20200429183710879.png

  

Nacos 配置入门

  

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

  

发布配置

  

  选择 配置管理配置列表 页面,点击最右侧 + 按钮新建配置。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612143748546.png

  

  Nacos Config 使用 Data IDGroup 来确定配置。

  下图显示 Data Idproduct-service.yaml,组使用默认组,并添加 yaml 格式的配置信息。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612174137527.png

1
2
3
project:
  name: SpringCloudAlibaba
  org: Aliababa

  

获取配置

  

创建项目

  

  我们创建聚合项目来讲解 Nacos,首先创建一个 pom 父工程。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612150746883.png

/resources/articles/spring/spring-cloud/nacos-config/image-20200612150658514.png

  

添加依赖

  

  pom.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?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 依赖。

1
2
3
4
5
<!-- spring cloud alibaba nacos config 依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

  完整依赖如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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 的地址和应用名。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 的完整格式如下:

1
${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 来配置。目前只支持 propertiesyaml 类型,默认为 properties

  

控制层

  

  使用 Spring 的 @Value 注解来获取配置信息,${} 中对应 Nacos 配置中心配置内容的 key,:后跟默认值。

  并且通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
    }

}

  

启动类

  

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200612174303736.png

  

  修改配置为以下内容,重新发布:

1
2
3
project:
  name: SpringCloudAlibaba-Nacos
  org: Aliababa

/resources/articles/spring/spring-cloud/nacos-config/image-20200612175005099.png

  

  控制台打印信息如下:

1
2
3
4
5
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 结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200612180228153.png

  

Nacos 配置核心概念

  

/resources/articles/spring/spring-cloud/nacos-config/1561217857314-95ab332c-acfb-40b2-957a-aae26c2b5d71.jpeg

配置

  

为什么需要配置?概念。

  在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 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)是一个应用的主配置文件

/resources/articles/spring/spring-cloud/nacos-config/1187916-20200515071147475-887445149.png

Namespace 命名空间

  

  前面已经介绍过命名空间的概念,用于隔离多个环境,而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们针对企业项目实际研发流程和环境进行规划。

  如某软件公司拥有开发、测试、生产三套环境,那么我们应该建立三个 Namespace 进行区分。

  

创建命名空间

  

  点击左侧菜单 命名空间,看到默认有一个 public(保留空间),点击右侧 新建命名空间进行创建。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612193730777.png

  

  按下图的方式分别创建 dev(开发环境)test(测试环境)prod(生产环境) 三个命名空间。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612193956311.png

  

  最终结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200612194200020.png

  

指定命名空间

  

  如果 spring.cloud.nacos.config.namespace 中没有指定名称空间,则使用 Nacos 的 public(保留空间)。还可以按以下方式指定自定义名称空间:

1
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

此配置必须在 bootstrap.yml 文件中。 spring.cloud.nacos.config.namespace 的值是命名空间的 ID,可以从 Nacos 控制台中检索 ID 的值。 添加配置时,请勿选择其他名称空间。 否则,将无法正确检索配置。

  

发布配置

  

  选择 配置管理配置列表 页面,选择 dev 环境,点击最右侧 + 按钮新建配置。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612195309046.png

  

  Nacos Config 使用 Data IDGroup 来确定配置。

  下图显示 Data Idproduct-service.yaml,组使用默认组,并添加 yaml 格式的配置信息。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612195602466.png

1
2
3
project:
  name: SpringCloudAlibaba-DEV
  org: Aliababa

  

获取配置

  

配置文件

  

  bootstrap.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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 实现配置自动更新。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200612195957009.png

  

Group 组

  

  Group 组信息可以在新建配置时进行指定,如下图:

/resources/articles/spring/spring-cloud/nacos-config/image-20200612210715273.png

  

配置管理

  

  这一小节我们通过大量配图演示控制台的相关操作。

  

新建/编辑/删除/查询

  

  右侧 + 新建配置。单条编辑或删除选择操作栏中的编辑或删除。批量删除勾选以后选择左下角红色删除。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612200909451.png

  

  可以通过 Data IdGroup 查询配置,还可以将查询结果导出。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612201956339.png

  

导入/导出/克隆

  

  前文提到命名空间用于隔离多个环境,每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。也就是说可能大量的配置项都是相同的,个别差异的配置项需要额外修改,在这种情况下,如果一条条重新添加肯定非常不友好,我们可以通过导入导出功能实现。

  比如,我们将 dev 环境下的配置先全选导出。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612201642801.png

  

  然后在 test 环境中导入,文件上传后将直接导入配置,请务必谨慎操作!

/resources/articles/spring/spring-cloud/nacos-config/image-20200612202250056.png

  

  通过克隆也可以达到相同的效果,不同的是克隆可以额外修改 Data IdGroup 信息。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612202837507.png

  

历史/回滚

  

  选择 配置管理历史版本 页面,通过 Data IdGroup 查询历史,可以查看每个历史版本的详情,或选择回滚至该版本。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612203644068.png

  

监听查询

  

  Nacos 提供配置订阅者,也就是监听者查询能力,同时提供客户端当前配置的 MD5 校验值,以便帮助用户更好的检查配置变更以后是否推送到 Client 端。

  选择 配置管理监听查询 页面,通过 配置或IPData IdGroup 查询。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612205026831.png

  

权限控制

  

  Nacos 提供了基于 RBAC 的权限控制,通过左侧 权限控制 菜单的 用户列表角色管理权限管理实现,可以算是傻瓜式操作了,鼠标多点几下就会了。

/resources/articles/spring/spring-cloud/nacos-config/image-20200612205657678.png

  

公共配置

  

  每个配置集对应一个应用,但是开发时我们可能会有一些公共配置被多个应用使用,这时候就需要扩展配置集或共享配置集来实现了。

  

扩展配置集

  

  我们先创建三个配置集,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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

/resources/articles/spring/spring-cloud/nacos-config/image-20200613091506127.png

  

获取配置

  

配置文件

  

  bootstrap.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.ext-config[n].refresh 来控制该配置集是否支持配置的动态刷新。默认情况下不支持。

  

控制层

  

  使用 Spring 的 @Value 注解来获取配置信息,${} 中对应 Nacos 配置中心配置内容的 key,:后跟默认值。

  并且通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200613092415646.png

  

共享配置集

  

  通过共享配置集的方式也可以实现公共配置的功能,唯一的区别就是共享配置集无法设置组信息,只获取 DEFAULT_GROUP。具体实现方式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
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 结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200613094010632.png

  

配置优先级

  

  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 转发到多个节点,如下图:

/resources/articles/spring/spring-cloud/nacos-config/1561258986171-4ddec33c-a632-4ec3-bfff-7ef4ffc33fb9.jpeg

  如果为了方便省事,可以使用直连 ip 模式,配置中按如下编写即可:

1
2
3
4
5
6
7
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 上下载源码方式。

1
2
3
4
5
6
7
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 包。

  

配置集群配置文件

  

  将安装包解压。

1
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个以上节点)

1
2
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 文件,运行该文件,结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200429220641953-1592013692421.png

  

application.properties 配置

  

  修改 nacos/conf/application.properties 文件的以下内容。

/resources/articles/spring/spring-cloud/nacos-config/image-20200429181636359-1592013692422.png

  最终修改结果如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#*************** 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 类。

/resources/articles/spring/spring-cloud/nacos-config/image-20200429183710879-1592013692422.png

  

启动服务器

  

Linux/Unix/Mac

  

  在 Nacos 的解压目录 nacos/bin 目录下启动。

  启动命令(在没有参数模式,是集群模式):

1
sh startup.sh

  

查看启动记录

  

  可通过 /nacos/logs/nacos.log(详细日志)或 /nacos/conf/start.out(启动记录)的输出内容查看是否启动成功。

  查看命令:

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

  启动成功输出结果:

1
2
3
4
5
6
7
8
9
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/

/resources/articles/spring/spring-cloud/nacos-config/image-20200429225047747.png

  

  从下图可以看到集群节点共有三个,其中 192.168.10.101:8848leader

/resources/articles/spring/spring-cloud/nacos-config/image-20200509172112177.png

  

关闭服务器

  

Linux/Unix/Mac

  

1
sh shutdown.sh

  

测试

  

直连 ip 模式

  

发布配置

  

  选择 配置管理配置列表 页面,点击最右侧 + 按钮新建配置。

1
2
3
4
5
Data ID: product-service.yaml
Group: DEFAULT_GROUP
Configuration format: YAML
Configuration content: project.name: SpringCloudAlibaba
                       project.org: Aliababa

  

获取配置

  

  bootstrap.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200612174303736.png

  

Nginx 转发

  

  再启动一台服务器 192.168.10.100,安装 Nginx,配置代理转发规则。

1
2
3
4
5
upstream nacos {
    server 192.168.10.101:8848;
    server 192.168.10.102:8848;
    server 192.168.10.103:8848;
}

/resources/articles/spring/spring-cloud/nacos-config/image-20200429230929281.png

  

获取配置

  

  bootstrap.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 结果如下:

/resources/articles/spring/spring-cloud/nacos-config/image-20200612174303736.png

  至此 Nacos 配置中心所有的知识点就讲解结束了。

/resources/articles/articles_bottom/end02.gif

本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议

大家可以通过 分类 查看更多关于 Spring Cloud 的文章。

  

🤗 您的点赞转发是对我最大的鼓励和支持。

📢 扫码关注 哈喽沃德先生「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~

/resources/mrhelloworld/qrcode/OfficialAccounts500-500.gif

「 感谢支持 」
 评论