Nacos配置中心使用规范

1. 关于Nacos引用方式

Nacos在Spring框架应用中使用方式共用4种:

1、nacos 原生引用方式

2、spring 引用方式

3、spring boot 引用方式

4、spring cloud 引用方式

每一种用法,略有差异,具体请参考Nacos官方文档:
Nacos 快速开始


2. 命名规范

2.1. 关于命名空间NameSpace的命名规范

命名空间NameSpace主要用于不同产品、不同平台,在配置管理上实现权限隔离,互不干扰。
命名格式规范:

 

{产品编码}-{环境名}

命名空间ID统一采用大写字母

{环境名} 为可选项,可以没有,如果有请使用拼音字母全拼

例如: JSCP、JSST、JSICP-HUANAN、JSICP-HUADONG

2.2. 关于Data ID的命名规范

2.2.1. 通用配置Data ID命名规范

命名格式规范:

 

{产品编码}-common-{配置特征名}.{文件类型}

配置特征名:即描述某一类配置共有的特征

2.2.2. 应用配置Data ID命名规范

应用配置相对于通用配置而言,专指应用独有的配置,不会也不应被其它应用使用的配置。
命名规范格式:

 

{应用服务名称}-{配置特征名}.{文件类型}

应用服务名称:即【spring.application.name】名称,同时也是微服务在注册中心的ID,具有唯一性。

Data ID 命名统一采用小写字母

例如:服务名为【jscp-jportal】 对应的应用配置data id为【jscp-jportal.properties】或者【jscp-jportal.yml】


2.3. 关于分组Group的命名规范

同一产品下的所有配置,在同一分组下,便于配置管理;
命名规范格式:

 

{分组名为产品编码}

Group分组名统一采用小写字母

例如:jscp、jsicp

2.4. 关于归属应用的命名规范

归属应用,不同于Group分组,通过分组可以快速找到某产品下所有的配置,但一个分组下包含了不同应用的配置,以及通用配置,如何快速找到某一应用下的所有配置?归属应用,应运而生。
命名规范格式:

 

{归属应用名为微服务名}

归属应用名与微服务名 【spring.application.name】 保持一致,同时也是微服务在注册中心的ID

2.5. 命名范例

以JLite为例,命名空间【JSICP-HUANAN】下的配置如下:

Data IDGroup归属应用备注
jsicp-common-mysql.ymljsicp通用配置
jsicp-common-redis.ymljsicp通用配置
jsicp-common-kafka.ymljsicp通用配置
jsicp-common-elasticsearch.ymljsicp通用配置
jsicp-common-hbase.ymljsicp通用配置
jsicp-common-mongodb.ymljsicp通用配置
jsicp-common-oss.ymljsicp通用配置
jsicp-common-constant.ymljsicp通用配置:常量
jlite-boot-starter.ymljsicpjlite-boot-starter应用配置:jlite
jlite-boot-starter-messages_en_us.propertiesjsicpjlite-boot-starter国际化配置-英文
jlite-boot-starter-messages_zh_cn.propertiesjsicpjlite-boot-starter国际化配置-中文简体
jlite-boot-starter-messages_zh_tw.propertiesjsicpjlite-boot-starter国际化配置-中文繁体
jlite-cloud-gateway.ymljsicpjlite-cloud-gateway应用配置:网关
jlite-cloud-gateway-flow-rule.jsonjsicpjlite-cloud-gateway应用配置:网关限流
jlite-cloud-gateway-api-group.jsonjsicpjlite-cloud-gateway应用配置:网关API分组

注意: 为什么建议将通用配置,按照配置特征进行data-id区分,这样做更有利于配置的管理,可以清楚知道每一个微服务,具体用到了哪些配置项。

如果将所有通用配置放在一起,无论配置是否真正被使用到,配置文件都会被加载,当遇到技术栈升级时,比如需要对数据库密码策略进行更换,或者OSS账号密码泄漏需要更换账号。此时,在众多微服务中,哪些微服务应该重启?无法准确快速知道。


3. 关于启动配置文件的加载使用规范

spring boot构建的应用
启动时最先被加载的配置文件为:application.properties

spring cloud构建的应用
启动时最先被加载的配置文件为:bootstrap.properties

原则上本地配置文件:bootstrap.properties / application.properties 仅用于配置Nacos的地址、账号、日志文件存储位置等需要在启动后第一时间加载的参数。

4. 关于日志配置文件的使用规范

spring boot应用不再需要logback-spring.xml配置文件

日志文件如何配置?

4.1. 日志配置

【第一步】 bootstrap.yml

## 日志配置
logging:
  file:
    name: ./logs/${spring.application.name}.log
  level:
    org.springframework.boot.context.config.ConfigFileApplicationListener: debug # 生产上建议将该类的日志级别设为debug,这样可以清楚知道,启动时应用程序加载了哪些配置文件,分别从哪里加载的。

# 生产上建议将该类的日志级别设为debug,这样可以清楚知道,启动时应用程序加载了哪些配置文件,分别从哪里加载的。

该配置的作用是指定日志文件存储位置,必须放在bootstrap.yml文件中,因为需要保证在应用启动第一时间能读取到。

【第二步】 application.yml

## 日志配置
logging:
  file:
    max-history: 3  # 日志文件保留天数
    max-size: 200MB # 日志文件大小
  level:
    com.jht.jlite.gateway.filter.CustomGlobalFilter: debug
    com.jht.jlite.gateway.strategy.CustomStrategyRouteFilter: debug

以上配置,相比logback-spring.xml配置更加简洁,放在应用对应nacos配置中,可以动态修改生效。



 

5. 关于应用程序部署目录结构的规范

应用程序部署目录结构规范,以Jlite 网关为例:

|
---jlite-cloud-gateway
    |
    |
    |---jlite-cloud-gateway-1.0.1-RELEASE.jar # jar包排除配置文件
    |
    |---libdecrypt.so
    |
    |---manage.sh # 启动脚本中不再注入非JVM参数,统一移到bootstrap.yml
    |
    |---config
    |   |
    |   |---bootstrap.yml # 启动配置
    |   |
    |---config-example # 配置参考:在nacos上建立同名data-id
    |   |
    |   |---jlite-cloud-gateway.yml
    |   |
    |   |---jlite-cloud-gateway-api-group.json
    |   |
    |   |---jlite-cloud-gateway-flow-rule.json
    |   |
    |---logs # 日志文件默认目录,Docker容器化部署将该目录映射到宿主机即可
    |   |
    |   |
  1. 为什么建议将jar包中的配置文件排除,这样做对于每一个配置项数据,在哪里进行配置(本地配置文件目录或配置中心),更加清晰,可见。便于问题的分析定位查找。
     

  2. 启动脚本 manage.sh 文件中,不再注入除JVM参数以外的其它任何启动参数,相关参数(环境,版本号,Nacos地址、日志文件目录)统一放到配置文件 bootstrap.yml 中管理。

5.1. 打包时排除本地配置文件的方法

打包时,请将 src/main/resources 目录下所有配置文件排除在jar包之外。
具体排除方法,在pom.xml文件中添加plugin:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <!-- 排除各类配置文件 -->
                    <excludes>
                        <exclude>*.yml</exclude>
                        <exclude>*.yaml</exclude>
                        <exclude>*.properties</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

5.2. 打包时自动从Nacos下载配置文件

请在pom文件中添加nacos-maven-plugin插件,

该插件是我司自定义开发的maven插件,希望通过简单的配置,实现打包时自动从Nacos配置中心下载配置文件,解决打包时过多依赖人工处理的问题。配置将按Data ID生成同名文件,生成的文件目录为:target/config-example/

<!-- Nacos打包插件,用于下载配置文件 -->
<plugin>
    <groupId>com.js.nacos</groupId>
    <artifactId>nacos-maven-plugin</artifactId>
    <version>1.1.2</version>
    <!-- 可选参数,可以不配置 -->
    <configuration>
        <!-- skip 如果为true,将不会从nacos下载任何配置,默认为false -->
        <skip>true</skip>
        <server-addr>10.10.204.110:8848</server-addr>
        <namespace>billing-cloud</namespace>
        <user>app</user>
        <password>123456</password>
    </configuration>
    <executions>
        <execution>
            <!--插件运行所在生命周期-->
            <phase>package</phase>
            <goals>
                <!-- 插件目标名固定为:config-download -->
                <goal>config-download</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<think>好的,我现在需要帮助用户了解如何在Nacos配置中心实现配置的自动刷新,特别是最佳实践。首先,我得回忆一下Nacos的相关知识,尤其是配置自动刷新的部分。根据用户提供的引用内容,特别是引用[2]和引用[3],里面提到了@RefreshScope注解和@NacosConfigKeysListener的使用。 首先,用户想知道如何实现自动刷新。根据引用[2],@RefreshScope是Spring Cloud的原生注解,用于自动刷新配置。所以使用这个注解应该是一个关键点。另外,引用[3]提到了@NacosConfigKeysListener,可以自定义监听特定的配置项,这可能也是一个方法。 接下来,我需要整理步骤。首先,确保项目正确集成了Nacos,配置了bootstrap.yml文件,因为它的优先级更高,确保应用启动时能拉取配置。然后,在需要刷新的Bean上添加@RefreshScope,这样当配置更新时,这些Bean会重新加载。此外,如果只需要监听特定配置的变化,可以使用@NacosValue配合@NacosConfigListener或@NacosConfigKeysListener注解,自定义回调逻辑。 然后,最佳实践部分。用户可能想知道如何优化自动刷新的流程,比如减少不必要的刷新,或者处理监听器的性能问题。比如,合理使用监听器的作用域,避免全局刷新带来的性能损耗,或者结合版本号控制配置的更新。此外,配置的版本管理和回滚机制也很重要,确保在配置错误时能快速恢复。 还要注意引用[2]中提到的配置加载顺序,必须确保bootstrap.yml正确配置,否则应用无法启动。另外,在Nacos Server修改配置后,Client端需要正确接收通知,这涉及到长轮询的机制,可能需要检查网络连接或Nacos Server的配置是否正常。 最后,用户可能需要示例代码来更好地理解如何实现这些步骤。比如展示如何在Spring Boot中使用@RefreshScope,或者如何编写一个监听特定配置的监听器类。同时,注意事项如配置格式的正确性(比如.yaml后缀),以及如何避免频繁刷新导致的服务不稳定。 总结起来,回答需要分步骤说明如何实现自动刷新,包括注解的使用、配置文件的设置,然后给出最佳实践的建议,比如监听器的优化、版本控制等,并提供示例代码和注意事项。同时,根据用户提供的引用,正确标注引用来源,确保信息的准确性。</think>在Nacos配置中心实现配置自动刷新的核心机制是通过**长轮询监听**和**注解驱动**实现的。以下是具体的最佳实践步骤与示例: --- ### 一、实现自动刷新的步骤 #### 1. 添加依赖与基础配置 在项目的`pom.xml`中引入Spring Cloud Alibaba Nacos Config依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 在`bootstrap.yml`中配置Nacos Server地址与数据ID(优先级高于`application.yml`): ```yaml spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension: yaml # 注意后缀是.yaml[^2] ``` --- #### 2. 使用`@RefreshScope`注解 在需要动态刷新的Bean上添加`@RefreshScope`,当配置更新时,该Bean会被自动重建以加载新值: ```java @RestController @RefreshScope // 启用配置自动刷新 public class ConfigController { @Value("${app.config.key:default}") private String configValue; @GetMapping("/value") public String getValue() { return configValue; } } ``` --- #### 3. 监听特定配置项 通过`@NacosConfigListener`或`@NacosValue`监听具体配置的变化,并自定义回调逻辑: ```java @Component public class CustomConfigListener { // 方式1:通过注解监听指定dataId @NacosConfigListener(dataId = "example.yaml") public void onConfigChange(String newConfig) { System.out.println("配置更新内容:" + newConfig); } // 方式2:结合@NacosValue实现细粒度监听 @NacosValue(value = "${app.config.key}", autoRefreshed = true) private String dynamicValue; } ``` --- ### 二、最佳实践建议 1. **合理控制刷新范围** - 仅对需要动态调整的Bean使用`@RefreshScope`,避免全局刷新带来的性能损耗。 - 使用`@NacosConfigKeysListener`监听特定Key的变化,减少无关配置触发的回调[^3]。 2. **配置版本管理** - 在Nacos Server中为配置添加版本号或描述信息,便于回滚。例如: ```yaml app: config: key: "v2.0" description: "2023-10更新" ``` 3. **异常处理与降级** - 在监听器中添加异常捕获逻辑,避免配置错误导致服务崩溃: ```java @NacosConfigListener(dataId = "example.yaml") public void onConfigChange(String newConfig) { try { // 解析并应用新配置 } catch (Exception e) { // 记录日志并回退到旧配置 } } ``` --- ### 三、注意事项 1. **配置格式与命名规范** - Nacos Server的配置文件后缀必须为`.yaml`而非`.yml`。 - 数据ID命名遵循`${spring.application.name}-${profile}.yaml`格式,确保环境隔离。 2. **长轮询机制调优** - 默认长轮询超时时间为30秒。若需调整,可在Nacos Server配置文件中修改: ```properties config.long-poll.timeout=60000 # 单位:毫秒 ``` --- ### 示例场景 假设需要动态调整日志级别: 1. 在Nacos中创建`log-config.yaml`,内容为: ```yaml logging: level: root: INFO com.example: DEBUG ``` 2. 在代码中注入配置并添加监听: ```java @RefreshScope @Component public class LogConfig { @Value("${logging.level.com.example}") private String logLevel; @PostConstruct public void init() { // 应用初始日志级别 } } ``` 当在Nacos控制台修改`com.example`的日志级别为`WARN`时,服务会立即生效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值