Nacos 配置中心

到这一步,你已经掌握了 nacos 的整体架构、名词概念,以及如何搭建 nacos 服务端。

下面我们开始编写 spring boot 程序,学习下如何把原先写在程序里的 yml\properties 转移到 nacos 上

添加配置

我们先进入 nacos 配置界面,添加如下内容

Data ID:    shar_nacos.properties
Group  :    DEFAULT_GROUP
配置格式:   user.name=shar

新建项目

接下来,我用 Gradle + Spring Boot 做下示范

通过 idea 新建完项目后,在配置文件添加如下依赖

build.gradle

plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}

dependencies {

    testCompile group: 'junit', name: 'junit', version: '4.12'

    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.2.1.RELEASE'

    // https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config
    compile group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-config', version: '2.2.1.RELEASE'

}

新建 bootstrap.properties

spring.application.name=shar_nacos
spring.cloud.nacos.config.server-addr=localhost:8848

注意:当你使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。

新建启动类

package com.shar.nacos;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class NacosApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        System.err.println("user name :"+userName);
    }

}

启动项目

项目正常启动了,我提取了控制台几条重要的日志:


//前面的文章提到了,具备本地容灾能力
c.a.n.c.c.impl.LocalConfigInfoProcessor  : LOCAL_SNAPSHOT_PATH:C:\Users\sharlot\nacos\config

//从shar_nacos,DEFAULT_GROUP 下读取配置
c.a.c.n.c.NacosPropertySourceBuilder     : Ignore the empty nacos configuration and get it based on dataId[shar_nacos] & group[DEFAULT_GROUP]
b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-shar_nacos.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-shar_nacos,DEFAULT_GROUP'}]
com.shar.nacos.NacosApplication          : No active profile set, falling back to default profiles: default

//本地项目已经读取到服务端的配置
user name :shar

//监听,从Server获取值变化了的DataID列表
c.a.n.client.config.impl.ClientWorker    : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker    : get changedGroupKeys:[]
c.a.n.client.config.impl.ClientWorker    : get changedGroupKeys:[]

本地配置动态更新

由于监听的存在,一旦服务端修改了配置参数,我们本地的环境中参数也会随之修改

如果你要关闭动态刷新:

spring.cloud.nacos.config.refresh-enabled==false 

如果你喜欢用yml

需要在 bootstrap.properties 追加

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

并且在 nacos 控制台新增 后缀&配置格式为yaml的配置

Data ID:    shar_nacos.yaml
Group  :    DEFAULT_GROUP
配置格式:    YAML

依据 spring.profile 激活

通常我们项目中会存在多套环境下的不同配置

我们可以通过 Spring 提供的${spring.profiles.active}来配置

在 nacos 规则中,你只能在 bootstrap.properties 中指定:

spring.profiles.active=dev

与之对应的,你需要在 nacos 控制台中新建 shar_nacos-dev.properties

此案例中我们通过spring.profiles.active=<profilename>的方式写死在配置文件中

而在真正的项目实施过程中这个变量的值是需要不同环境而有不同的值

这个时候通常的做法是通过在启动脚本中添加-Dspring.profiles.active=<profile>参数指定其配置来达到环境间灵活的切换~~

依据 namespace 激活

在前面的学习中,我们掌握了 namespace 的一个应用场景是不同环境的配置隔离(你可能会和 spring.profiles.active 概念混淆,我后面的文章中会帮你梳理开发方式~)

在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:

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

该配置必须放在 bootstrap.properties 文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取

依据 Group 激活

在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:

spring.cloud.nacos.config.group=DEVELOP_GROUP

该配置必须放在 bootstrap.properties 文件中

扩展\共享的 Data Id 配置

如果我需要让 同一份配置在多个应用间共享,又或者 一个应用有多个配置文件

如何实现呢?

Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置

如下我定义了三个:

spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true


spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true


spring.cloud.nacos.config.shared-configs[0].data-id=ext-config-common03.properties
spring.cloud.nacos.config.shared-configs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true

使用规则:

  • configs[n] 的配置方式,设置数组索引即可支持多个 Data Id 的配置

  • group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP

  • refresh 扩展配置中的刷新功能,默认是不支持的

  • 多扩展配置时,优先级关系是 configs[n] 其中 n 的值越大,优先级越高

  • data-id 的值必须带文件扩展名,它不受 spring.cloud.nacos.config.file-extension 影响

  • 一共三种 Data Id,除了本身配置外,shared 是共享,extension 是继承,优先级:本身 > 继承 > 共享

完全关闭配置

通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config

一份较完整的配置

# 是否开启 nacos
spring.cloud.nacos.config.enabled = true

# 是否开启实时刷新
spring.cloud.nacos.config.refresh-enabled=true

# 调整日志等级,屏蔽烦人的 info 日志
logging.level.com.alibaba.nacos.client.naming=error
logging.level.com.alibaba.cloud=error

# 服务端ip+端口,或者域名加端口(80端口不能省略)
spring.cloud.nacos.config.server-addr=localhost:8848

# 哪个 namespace。若此项配则必须有值且不是 public,不配默认是 public
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7

# 哪个 group。若此项配则必须有值,不配默认是 DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP

##############################################
####  下面三项组成 Data Id 的名字:<prefix>-<name>-<active>.<file-extension>
##############################################
# Data Id 的前缀,可不配,配了为空视为没配
spring.cloud.nacos.config.prefix=
# 应用名称
spring.application.name=shar_nacos
# 激活哪一份,可不配,配了为空视为没配
spring.profiles.active=
# Data Id 的文件名后缀。若此项配则必须有值(properties\yaml),此项不配默认properties
spring.cloud.nacos.config.file-extension=properties


##############################################
####  你需要加载扩展的配置
##############################################
spring.cloud.nacos.config.extension-configs[0].data-id=base.yaml
spring.cloud.nacos.config.extension-configs[0].group=BASE_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true

##############################################
####  你需要加载共享类型的配置
##############################################
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml
spring.cloud.nacos.config.shared-configs[0].group=COMMON_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true

技巧 & 建议

  • 不使用 public 命名空间
  • 在开发阶段,通过 idea jvm 指定如下参数
  • 在生产环境,通过运维脚本指定如下参数
spring.cloud.nacos.config.server-addr=localhost:8488
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
spring.cloud.nacos.config.group=DEFAULT_GROUP
spring.profiles.active=dev

写在最后

以上内容参考自 Nacos Config,本文更新于2020年7月,若因内容滞后造成学习障碍,见谅!


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:Nacos 配置中心

字数:1.9k

本文作者:夏来风

发布时间:2020-07-10, 23:58:34

原始链接:http://www.demo1024.com/blog/nacos-dev-config/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。