常见的配置中心:Nacos

本文详细介绍了阿里巴巴的Nacos配置中心,包括命名空间、配置集ID、配置分组的概念,以及如何启动Nacos、创建配置、通过API查询配置、使用NacosClient获取配置。还展示了如何实现配置的版本回滚、自动刷新,并探讨了配置加密的可能性。此外,文中给出了动态刷新配置的示例代码和日志输出,以及配置加密的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

Nacos是阿里在2018年发布的集服务发现、动态配置等功能为一体的开源产品。下文将会围绕Nacos对配置中心需要的各功能进行讲解。

1.Nacos配置概念

命名空间

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

配置集 ID

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

配置分组

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

2.快速启动Nacos 

https://github.com/alibaba/nacos/releases根据当前环境下载对应的包,解压压缩包,根据实际情况修改配置,如果没有对db进行配置,Nacos会默认使用内嵌数据库Derby。

新建自己的命名空间

新建我们的配置集

通过https://nacos.io/zh-cn/docs/open-api.html提供的api查询我们的配置是否添加成功

3.Nacos Client

我会基于Nacos提供的demo来进行讲解

引入依赖

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>0.2.1.RELEASE</version>
        </dependency>

3.1 获取配置

添加配置

spring:
  cloud:
    nacos:
      config:
        server-addr: 172.16.0.11:8848 # Nacos 服务器地址
        namespace: 2a05557f-1077-4274-9074-4623e603ac85 # 使用的 Nacos 的命名空间,默认为 null
        group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
        name: tf-auth-dev # 使用的 Nacos 配置集的 dataId
        file-extension: yml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties

spring.cloud.nacos.config.server-addr Nacos 服务器地址

spring.cloud.nacos.config.namespace 配置命名空间,使用默认控制不需要配置,如果使用自建的命名空间需要配置命名空间的命名空间id

spring.cloud.nacos.config.group 配置分组,默认为 DEFAULT_GROUP

spring.cloud.nacos.config.name 配置文件名字,即data-id

spring.cloud.nacos.config.file-extension 配置文件对应的格式,在新建的时候设置,默认PROPERTIES

nacos-test-one.yml

nacos:
    test:
        one: one

访问代码

package com.kenho.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValueController {
    @Value("${nacos.test.one}")
    private String one;

    @RequestMapping("one")
    public void one()
    {
        System.out.println("nacos.test.one:"+one);
    }
}

启动

2021-03-25 23:43:42.628  INFO 1427 --- [           main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'nacos-test-one.yml', group: 'DEFAULT_GROUP'
2021-03-25 23:43:42.630  INFO 1427 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='nacos-test-one.yml'}]}

输出

nacos.test.one:one

3.2 多组配置

添加配置

spring:
  cloud:
    nacos:
      config:
        server-addr: 172.16.0.11:8848 # Nacos 服务器地址
        namespace: da1c5f3b-7ab5-4461-a251-1abf7a03b85e # 使用的 Nacos 的命名空间,默认为 null
        group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
        sharedDataids: nacos-test-one.yml,nacos-test-two.yml
        file-extension: yml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties

spring.cloud.nacos.config.sharedDataids 一个分组下的多个配置,以逗号隔开

nacos-test-two.yml

nacos:
    test:
        two: two

访问代码

package com.kenho.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValueController {
    @Value("${nacos.test.one}")
    private String one;

    @Value("${nacos.test.two}")
    private String two;

    @RequestMapping("one")
    public void one()
    {
        System.out.println("nacos.test.one:"+one);
    }

    @RequestMapping("two")
    public void two()
    {
        System.out.println("nacos.test.two:"+two);
    }
}

启动

2021-03-25 23:59:59.921  INFO 1621 --- [           main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'nacos-test-one.yml', group: 'DEFAULT_GROUP'
2021-03-25 23:59:59.930  INFO 1621 --- [           main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'nacos-test-two.yml', group: 'DEFAULT_GROUP'
2021-03-25 23:59:59.939  INFO 1621 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='null.yml'}, NacosPropertySource {name='nacos-test-two.yml'}, NacosPropertySource {name='nacos-test-one.yml'}]}

输出

nacos.test.one:one
nacos.test.two:two

3.3 多分组配置

添加配置

spring:
  cloud:
    nacos:
      config:
        server-addr: 172.16.0.11:8848 # Nacos 服务器地址
        namespace: da1c5f3b-7ab5-4461-a251-1abf7a03b85e # 使用的 Nacos 的命名空间,默认为 null
        file-extension: yml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
        ext-config:
          - dataId: nacos-test-one.yml
            group: DEFAULT_GROUP
          - dataId: nacos-test-other.yml
            group: OTHER_GROUP

spring.cloud.nacos.config..ext-config.dataId[0] 不同分组环境配置的dataid

spring.cloud.nacos.config..ext-config.group[0] 不同分组环境配置的分组

nacos-test-other.yml

nacos:
    test:
        other: other

访问代码

package com.kenho.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValueController {
    @Value("${nacos.test.one}")
    private String one;


    @Value("${nacos.test.other}")
    private String other;

    @RequestMapping("one")
    public void one()
    {
        System.out.println("nacos.test.one:"+one);
    }



    @RequestMapping("other")
    public void two()
    {
        System.out.println("nacos.test.other:"+other);
    }
}

启动

2021-03-26 00:12:34.169  INFO 1737 --- [           main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'nacos-test-one.yml', group: 'DEFAULT_GROUP'
2021-03-26 00:12:34.174  INFO 1737 --- [           main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'nacos-test-other.yml', group: 'OTHER_GROUP'
2021-03-26 00:12:34.179  INFO 1737 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='null.yml'}, NacosPropertySource {name='nacos-test-other.yml'}, NacosPropertySource {name='nacos-test-one.yml'}]}

输出

nacos.test.one:one
nacos.test.other:other

4.版本回滚

首先Nacos的版本有自己的版本回滚概念,参考https://github.com/alibaba/nacos/issues/4064,如下图所示你只可以回滚当前版本之前的版本

5.自动刷新

Nacos官方github提供的例子的自动刷新是有问题的 注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。具体查看https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明

添加依赖

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud alibaba 依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

添加配置

        ext-config:
          - dataId: nacos-test-one.yml
            group: DEFAULT_GROUP
            refresh: true
          - dataId: nacos-test-other.yml
            group: OTHER_GROUP
            refresh: true

spring.cloud.nacos.config..ext-config.refresh[0]  设置该配置组是否自动刷新,在当前版本中的依赖默认是false的

拓展信息

通过查看源码NacosPropertySourceLocator生成NacosPropertySource的逻辑可知道,除了loadApplicationConfiguration方法对标spring.cloud.nacos.config.namespace,spring.cloud.nacos.config.group ,spring.cloud.nacos.config.name ,spring.cloud.nacos.config.file-extension 生成的对象是默认自动刷新。而loadSharedConfiguration方法和loadExtConfiguration方法生成的对象默认却是false的,所以要根据实际需要对对应配置进行进行刷新设置。

	public PropertySource<?> locate(Environment env) {
		nacosConfigProperties.setEnvironment(env);
		ConfigService configService = nacosConfigManager.getConfigService();

		if (null == configService) {
			log.warn("no instance of config service found, can't load config from nacos");
			return null;
		}
		long timeout = nacosConfigProperties.getTimeout();
		nacosPropertySourceBuilder = new NacosPropertySourceBuilder(configService,
				timeout);
		String name = nacosConfigProperties.getName();

		String dataIdPrefix = nacosConfigProperties.getPrefix();
		if (StringUtils.isEmpty(dataIdPrefix)) {
			dataIdPrefix = name;
		}

		if (StringUtils.isEmpty(dataIdPrefix)) {
			dataIdPrefix = env.getProperty("spring.application.name");
		}

		CompositePropertySource composite = new CompositePropertySource(
				NACOS_PROPERTY_SOURCE_NAME);

		loadSharedConfiguration(composite);
		loadExtConfiguration(composite);
		loadApplicationConfiguration(composite, dataIdPrefix, nacosConfigProperties, env);
		return composite;
	}

对需要刷新的配置的类设置@RefreshScope注解

package com.kenho.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class ValueController {
    @Value("${nacos.test.one}")
    private String one;


    @Value("${nacos.test.other}")
    private String other;

    @RequestMapping("one")
    public void one()
    {
        System.out.println("nacos.test.one:"+one);
    }



    @RequestMapping("other")
    public void two()
    {
        System.out.println("nacos.test.other:"+other);
    }
}

更新配置刷新服务配置日志

2021-03-29 22:08:59.128  INFO 12054 --- [51-1abf7a03b85e] c.a.n.client.config.impl.ClientWorker    : [fixed-172.16.0.11_8848-da1c5f3b-7ab5-4461-a251-1abf7a03b85e] [polling-resp] config changed. dataId=nacos-test-one.yml, group=DEFAULT_GROUP, tenant=da1c5f3b-7ab5-4461-a251-1abf7a03b85e
2021-03-29 22:08:59.129  INFO 12054 --- [51-1abf7a03b85e] c.a.n.client.config.impl.ClientWorker    : get changedGroupKeys:[nacos-test-one.yml+DEFAULT_GROUP+da1c5f3b-7ab5-4461-a251-1abf7a03b85e]
2021-03-29 22:08:59.142  INFO 12054 --- [51-1abf7a03b85e] c.a.n.client.config.impl.ClientWorker    : [fixed-172.16.0.11_8848-da1c5f3b-7ab5-4461-a251-1abf7a03b85e] [data-received] dataId=nacos-test-one.yml, group=DEFAULT_GROUP, tenant=da1c5f3b-7ab5-4461-a251-1abf7a03b85e, md5=b63f4defc2ca8f5cdd5cbd80a15fa1b8, content=nacos:
    test:
        one: oneone, type=yaml
2021-03-29 22:08:59.143  INFO 12054 --- [51-1abf7a03b85e] c.a.nacos.client.config.impl.CacheData   : [fixed-172.16.0.11_8848-da1c5f3b-7ab5-4461-a251-1abf7a03b85e] [notify-context] dataId=nacos-test-one.yml, group=DEFAULT_GROUP, md5=b63f4defc2ca8f5cdd5cbd80a15fa1b8
2021-03-29 22:08:59.352  WARN 12054 --- [51-1abf7a03b85e] c.a.c.n.c.NacosPropertySourceBuilder     : Ignore the empty nacos configuration and get it based on dataId[null.yml] & group[DEFAULT_GROUP]
2021-03-29 22:08:59.352  INFO 12054 --- [51-1abf7a03b85e] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-null.yml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-nacos-test-other.yml,OTHER_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-nacos-test-one.yml,DEFAULT_GROUP'}]
2021-03-29 22:08:59.353  INFO 12054 --- [51-1abf7a03b85e] o.s.boot.SpringApplication               : No active profile set, falling back to default profiles: default
2021-03-29 22:08:59.361  INFO 12054 --- [51-1abf7a03b85e] o.s.boot.SpringApplication               : Started application in 0.217 seconds (JVM running for 107.666)
2021-03-29 22:08:59.370  INFO 12054 --- [51-1abf7a03b85e] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [nacos.test.one]
2021-03-29 22:08:59.370  INFO 12054 --- [51-1abf7a03b85e] c.a.nacos.client.config.impl.CacheData   : [fixed-172.16.0.11_8848-da1c5f3b-7ab5-4461-a251-1abf7a03b85e] [notify-ok] dataId=nacos-test-one.yml, group=DEFAULT_GROUP, md5=b63f4defc2ca8f5cdd5cbd80a15fa1b8, listener=com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1@7edffae3 
2021-03-29 22:08:59.370  INFO 12054 --- [51-1abf7a03b85e] c.a.nacos.client.config.impl.CacheData   : [fixed-172.16.0.11_8848-da1c5f3b-7ab5-4461-a251-1abf7a03b85e] [notify-listener] time cost=227ms in ClientWorker, dataId=nacos-test-one.yml, group=DEFAULT_GROUP, md5=b63f4defc2ca8f5cdd5cbd80a15fa1b8, listener=com.alibaba.cloud.nacos.refresh.NacosContextRefresher$1@7edffae3 

6.配置加密

查看官方问答地址https://nacos.io/zh-cn/docs/faq.html,目前为止暂时还不支持官方提供的配置加密功能,只能靠 sdk 做好了加密再存到 nacos 中。

添加依赖

        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>1.16</version>
        </dependency>

添加配置

jasypt:
  encryptor:
    password: stephanie #根密码

nacos-test-one.yml

nacos:
    test:
        one: ENC(9PO2acQm5wpRqNV6oBXZ+w==)

输出

nacos.test.one:oneone

原生的动态刷新对配置加密支持不支持,目前应该只能支持密码等私密信息进行加密。

参考:https://nacos.io/zh-cn/docs/concepts.html

github:https://github.com/tale2009/Distributed-Learning/tree/main/NacosConfig-Learning

<think>好的,我现在需要解决用户在使用Nacos时遇到的配置无法获取的问题。用户提到他们使用了@NacosValue注解,但无法获取配置,导致空指针异常。首先,我需要回顾Nacos的基本配置机制,确保用户遵循了正确的配置结构。 首先,Nacos配置管理基于Namespace、Group和Data ID这三个维度。用户需要确认这三个参数的设置是否正确,尤其是在Spring Boot应用中,是否在bootstrap.yml或application.yml中正确配置了namespace、group和data-id。可能用户没有指定namespace,导致配置被读取到默认的public命名空间下,而实际配置可能存放在其他命名空间。 接下来,检查依赖版本是否兼容。用户使用的是Spring Boot 3.x,而他们引用的Nacos Config客户端版本是2023.0.1.2。我需要确认这个版本是否支持Spring Boot 3.x,因为版本不兼容是常见问题。例如,Spring Cloud Alibaba的某些版本可能与Spring Boot 3.x不兼容,可能需要升级到更高版本或使用特定的兼容版本。 然后,配置文件的位置和格式是否正确。Nacos的Data ID通常包括应用名称和环境后缀,例如appname-dev.yaml。用户需要确保Data ID的命名符合规范,并且配置内容格式正确,比如YAML或Properties格式。此外,配置文件是否已经正确发布到Nacos服务器上,可能需要用户登录Nacos控制台确认配置是否存在且内容正确。 动态刷新的问题也不容忽视。即使配置正确,如果缺少@RefreshScope注解,配置更新后可能不会自动刷新。用户需要在使用了@NacosValue的类上添加该注解,以确保配置变更时能动态刷新。 另外,网络连接和权限问题也可能导致配置无法获取。用户需要检查Nacos服务器的地址是否正确,应用是否有权限访问该地址,以及防火墙或安全组是否阻止了连接。此外,Nacos服务器的日志可能包含错误信息,帮助诊断连接或鉴权问题。 最后,建议用户通过开启Spring Boot的调试日志来查看详细的配置加载过程,这有助于定位问题所在。例如,设置logging.level.com.alibaba.cloud.nacos=DEBUG可以输出Nacos客户端的详细日志,查看配置拉取是否成功,或者是否有异常抛出。 总结下来,可能的解决方案包括检查配置参数、依赖版本、配置文件格式、动态刷新注解、网络连接以及查看日志。需要逐步排查每个环节,找到具体原因。</think>### Nacos配置无法获取的解决方案 #### 1. 检查配置三要素匹配性 确认**Namespace/Group/Data ID**三元组在Nacos控制台和代码配置中的一致性: - 在`bootstrap.yml`中设置完整参数: ```yaml spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 namespace: 你的命名空间ID group: DEFAULT_GROUP file-extension: yaml ``` 若未显式指定namespace,默认使用public命名空间[^1]。通过Nacos控制台「命名空间」菜单可查看具体ID。 #### 2. 验证依赖兼容性 Spring Boot 3.x需要对应版本的Spring Cloud Alibaba: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <!-- 推荐使用2022.0.0.0-RC2版本 --> <version>2022.0.0.0-RC2</version> </dependency> ``` 注意:当前官方对Spring Boot 3.x的完全支持仍在演进中,建议参考[Spring Cloud Alibaba版本说明](https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明)。 #### 3. 确认配置加载顺序 Spring Boot应用启动时按以下顺序加载配置: ``` bootstrap.yml -> Nacos远程配置 -> application.yml ``` 在`bootstrap.yml`中必须包含nacos配置信息,且需要添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> ``` #### 4. 配置动态刷新 在需要使用动态配置的类上添加注解: ```java @RefreshScope @RestController public class ConfigController { @NacosValue(value = "${你的配置:默认值}", autoRefreshed = true) private String configValue; } ``` #### 5. 排查网络连接问题 使用telnet命令测试连接性: ```bash telnet nacos-server-ip 8848 ``` 若连接失败,检查: - 安全组规则 - 本地防火墙设置 - Nacos服务状态(通过`curl http://nacos-server:8848/nacos/`验证) #### 6. 查看详细日志 在`application.yml`中开启调试日志: ```yaml logging: level: com.alibaba.cloud.nacos: DEBUG org.springframework.cloud: DEBUG ``` 观察日志中是否出现`configData`加载记录或连接异常信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值