个人 二维码




公众号二维码

name - artist
00:00

      目录

      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. 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

      「 感谢支持 」
       评论