天天看点

nacos (四). Nacos Config 配置中心

目录:

  1. nacos Config是什么?
  2. 快速接入
  3. 多环境隔离
    1. namespace 概念
    2. 分组 Group
    3. 客户端配置文件类型设置
    4. 项目配置实践
    5. 共享配置 & 多配置文件
  4. 配置中心的高可用集群

一. Nacos Config

 是什么?

Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。

Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。

二. 快速接入

1. Nacos 服务端添加配置

先安装好 Nacos Server ,然后启动。

在 配置管理 - 配置列表 中添加一个配置。如下图所示:

nacos (四). Nacos Config 配置中心

编辑好之后点击发布即可。

  • Data ID : 一般为应用名称,对应 Spring Boot 项目中的 

    spring.application.name

     参数
  • Group : 组,一般用来区分项目,此处直接用默认的公共组,后续会详细说明
  • 配置格式: 一般默认为 Properties 格式,你可以根据自己的喜好去切换。

2. 客户端使用

以 Spring Boot 项目为例。先添加依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
           

在 

resource

 文件夹中创建配置文件 

bootstrap.yml

 来配置 Nacos Server 相关的参数,如下所示:

spring:
  application:
    name: nacos-config-base
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # 权限认证,nacos.core.auth.enabled=true 时需要添加
      username: nacos
      password: James2020+
      config:
        # nacos config 的开关
        # enabled: false
        prefix: nacos-config-base
        file-extension: yaml
        group: DEFAULT_GROUP
           

创建启动类 

NacosConfigBaseApplication

 ,代码如下所示:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.concurrent.TimeUnit;

@SpringBootApplication
public class NacosConfigBaseApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigBaseApplication.class, args);
        while (true) {
            // 当动态配置刷新时,会更新到 Enviroment 中,因此这里每隔一秒中从 Enviroment 中获取配置
            String userName = applicationContext.getEnvironment().getProperty("base.name");
            String userAge = applicationContext.getEnvironment().getProperty("base.age");
            System.err.println("name :" + userName + "; age: " + userAge);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
           

上面的代码是每隔一秒,获取一次 

base.name

 与 

base.age

 参数并打印。

applicationContext.getEnvironment().getProperty("base.age");

 这是获取参数的一种方式。还可以用过注解来获取。

将启动类的代码注释掉,创建一个 

TestController

 类,添加如下代码:

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;

@RefreshScope
@RestController
public class TestController {

    @Value("${base.name}")
    String name;

    @Value("${base.age}")
    String age;

    @GetMapping("/name")
    public String getName() {
        return name;
    }

    @GetMapping("/age")
    public String getAge() {
        return age;
    }
}
           

我们可以把 Nacos Config 中配置的参数,当成本地参数一样,使用 

@Value("${}")

注解来获取。同时加上 

@RefreshScope

 注解以保证可以实时更新。

三.多环境隔离

日常开发中,我们常常会有开发环境,测试环境,预发布环境,生产环境等等。为了更好的区别这些环境,且防止配置混乱。官方及我个人都非常推荐使用 namespace 进行环境隔离。

注:Nacos Config 支持 profile 粒度的环境区分,但个人不建议这么使用。使用 namespace 做环境隔离更彻底更安全,也更易于管理。

1. namespace 概念

这里引用官方的概念说明:

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

namespace 创建

打开 Nacos 控制台,在 命名空间 中可以对其进行管理,如下图所示。

nacos (四). Nacos Config 配置中心

要注意的是,在项目中如果要指定命名空间,是通过 

命名空间ID

的,而不是通过名称。

配置好了命名空间后,再打开配置列表,则可以在上方看到目前所有的命名空间。不同的命名空间可以允许存在相同 Data ID 的配置。

nacos (四). Nacos Config 配置中心

namespace 在代码中的配置如下:

spring:
  cloud:
    nacos:
      config:
        # 这里使用的是命名空间 ID 
        namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3
           

2. 自定义 Group

一般我们会使用 namespace 区分环境,使用 Group 来区分项目,使用 Data ID 区分配置。以此来管理多项目,多环境下的配置文件。

Group 一般没有指定的话,默认为 DEFAULT_GROUP 。如果需要自定义的话,在 Nacos 控制台,创建配置文件的时候自定义即可。在代码中写法如下:

spring:
  cloud:
    nacos:
      config:
        group: SPRING_CLOUD_EXAMPLE_GROUP
           

3. 客户端配置文件类型设置

1.在bootstrap.properties文件中

nacos (四). Nacos Config 配置中心
spring:
  profiles:
    active: dev  #${spring.profile.active}

  application:
    name: consumer-user  #${prefix}

  cloud:
    nacos:
      config:
        server-addr: localhost:80
        file-extension: yaml  #${file-extension}
           

注意:

spring.cloud.nacos.config.file-extension=properties,yml,yaml

属性声明从配置中心中读取的配置文件格式

该配置的缺省值为properties,即默认是读取properties格式的配置文件。当客户端没有配置该属性,并且在nacos server添加的是yml格式的配置文件,则给客户端会读取不到配置文件,导致启动失败。

非properties配置格式,必须添加如下配置才可生效

spring.cloud.nacos.config.file-extension=yml

2. 在Nacos管理中心添加配置,根据profile设置不同的环境配置

把application.yml的配置移动到nacos中

springboot中我们可以通过配置spring.profiles.active 实现在开发、测试、生产环境下采用不同的配置文件

同样,我们同科可以在nacos server分别创建

${application.name}-dev.properties

${application.name}-test.properties

${application.name}-prod.properties

 然后通过命令启动jar时 设置spring.profiles.active来实现不同环境下使用不同的配置文件。

java -jar nacos-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

同样也适用于yml/yaml文件,只是客户端设置spring.cloud.nacos.config.file-extension=yaml具体可见上一个说明

nacos (四). Nacos Config 配置中心
nacos (四). Nacos Config 配置中心

DataId格式为

${prefix}-${spring.profile.active}.${file-extension}

4. 项目配置实践

在项目实际配置中,个人建议如下按照如下方式进行配置。

首先,配置文件要按照如下方式建立:

  • bootstrap.yml : 基础配置,配置 Nacos Config 的基础配置
  • application.yml : 存储一些不需要放在 Nacos Config 的配置
  • bootstrap-dev.yml : 环境参数,开发环境
  • bootstrap-test.yml : 环境参数,测试环境
  • bootstrap-prod.yml : 环境参数,线上环境

配置内容分别如下:

bootstrap-dev.yml

nacos:
  server-addr: 127.0.0.1:8848
  username: username
  password: password
  # 开发环境的 namespace ID
  namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3
           

bootstrap-test.yml

nacos:
  server-addr: 192.168.9.10:8848
  username: username
  password: password
  # 测试环境的 namespace ID
  namespace: a463038a-525b-4ad0-988e-ec71ff043c22
           

bootstrap-prod.yml

nacos:
  server-addr: 100.100.10.1:8848
  username: username
  password: password
  # 生产环境的 namespace ID
  namespace: 0d84f533-74ca-4ca5-9dd8-01e8866cd0c4
           

bootstrap.yml

spring:
  profiles:
    active: dev
  application:
    name: nacos-config-advanced
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # 权限认证,nacos.core.auth.enabled=true 时需要添加
      username: ${nacos.username}
      password: ${nacos.password}
        config:
          server-addr: ${nacos.server-addr}
          namespace: ${nacos.namespace}
          prefix: nacos-config-base
          file-extension: yaml
          group: SPRING_CLOUD_EXAMPLE_GROUP
           

共享配置 & 多配置文件

日常开发中,多个模块可能会有很多共用的配置,比如数据库连接信息,Redis 连接信息,RabbitMQ 连接信息,监控配置等等。

那么此时,我们就希望可以加载多个配置,多个项目共享同一个配置之类等功能。Nacos Config 也确实支持。

我们可以使用 

spring.cloud.nacos.config.shared-configs

 和 

spring.cloud.nacos.config.extension-configs

 两个参数节点来配置。

配置实例如下:

spring:
  application:
    name: nacos-config-multi
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      username: ${nacos.username}
      password: ${nacos.password}
      config:
        server-addr: ${nacos.server-addr}
        namespace: ${nacos.namespace}
        # 用于共享的配置文件
        shared-configs:
          - data-id: common-mysql.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

          - data-id: common-redis.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

          - data-id: common-base.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

        # 常规配置文件
        # 优先级大于 shared-configs,在 shared-configs 之后加载
        extension-configs:
          - data-id: nacos-config-advanced.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP
            refresh: true

          - data-id: nacos-config-base.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP
            refresh: true
           

参数解析:

  • data-id : Data Id
  • group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • refresh: 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
这里的Data ID 需要注意,后面是加 

.yaml

 后缀的,且不需要指定 

file-extension

。这个有一个小坑,那就是在 Nacos 控制台添加配置文件时,Data ID 的命名就要是 

common-mysql.yaml

 这种带后缀的。且后缀名要和配置类型想匹配,否则将会读取不到配置。

具体配置如下图所示,可与之前章节的配置对比下,之前章节的 Data ID 是没有带后缀的。

nacos (四). Nacos Config 配置中心

关于多配置文件的优先级问题:

  1. 后加载的优先级高;
  2. extension-configs 优先级大于 shared-configs,因为在 shared-configs 之后加载
  3. shared-configs 与 extension-configs 的配置列表中,在下面的配置优先级高。

四. nacos server的集群部署

集群部署架构图

官方的推荐部署架构图:

nacos (四). Nacos Config 配置中心

推荐用户把所有服务列表放到一个vip(虚拟IP,主机宕机后可以自动漂移到备用机器上)下面,然后挂到一个域名下面

http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。

http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。

http://nacos.com:port/openAPI 域名+VIP模式,可读性好,而且换ip方便,推荐模式

具体操作实践

注:目前器群模式下不采用mysql作为配置文件的存储方式,所以需要先配置为采用mysql数据源模式,我在上nacos1.4.1安装 中已经说明了,这里不再介绍,直接配置集群。

步骤如下:

1.conf文件夹下的文件如下图所示,其中下载的压缩包解压出来是没有cluster.conf的,通过复制cluster.conf-example并修改文件名得来。

修改cluster.conf,将部署nacos server的三台服务器ip地址写上即可

三台服务器cluster.conf文件相同,都是协商这三个IP地址即可

#it is ip
#example
114.116.137.***
132.232.159.***
47.107.122.***
           

2.分别启动三台nacos server

修改客户端,在客户端的bootstrap.properties文件中修改server的IP地址

注:修改成自己的三台服务器ip地址,用逗号分隔

spring.cloud.nacos.config.server-addr=114.116.137.***:8848,132.232.159.***:8848,47.107.122.***:8848

 ``

3.启动客户端 发现可以正常启动