Nacos配置管理核心实操记录:配置共享、配置热更新

一、配置共享:解决微服务配置冗余问题

在微服务架构中,多个服务往往存在相同的配置(如数据库连接、Redis配置、日志级别、跨域配置等),若每个服务单独配置,会造成冗余且难以维护。Nacos通过"全局配置+服务配置+环境配置"的层级机制,实现配置共享,同时支持自定义共享规则,兼顾通用性与灵活性。


Nacos配置加载遵循"就近原则",高优先级配置会覆盖低优先级配置,核心层级如下(从高到低):

  1. 服务级配置:针对单个服务的专属配置(如user-service-dev.yml),仅对该服务生效;

  2. 共享配置:所有服务或指定服务组共享的配置(如shared-dev.yml),可被多个服务继承;

  3. 全局配置:所有服务通用的配置(如global-dev.yml),作用于整个命名空间下的所有服务;

  4. 本地配置:服务本地application.yml/properties配置,优先级最低,仅在Nacos配置未加载时生效。


以通用数据库连接配置为例,通过nacos配置管理实现同时配置多个服务的数据库连接

:分为两步:

  • 在Nacos中添加共享配置

  • 微服务拉取配置

注意这里的jdbc的相关参数并没有写死,例如:

  • 数据库ip:通过${hm.db.host:192.168.150.101}配置了默认值为192.168.150.101,同时允许通过${hm.db.host}来覆盖默认值

  • 数据库端口:通过${hm.db.port:3306}配置了默认值为3306,同时允许通过${hm.db.port}来覆盖默认值

  • 数据库database:可以通过${hm.db.database}来设定,无默认值


拉取共享配置

接下来,我们要在微服务拉取共享配置。将拉取到的共享配置与本地的application.yaml配置合并,完成项目上下文的初始化。

不过,需要注意的是,读取Nacos配置是SpringCloud上下文(ApplicationContext)初始化时处理的,发生在项目的引导阶段。然后才会初始化SpringBoot上下文,去读取application.yaml

也就是说引导阶段,application.yaml文件尚未读取,根本不知道nacos 地址,该如何去加载nacos中的配置文件呢?

SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml(或者bootstrap.properties)的文件,如果我们将nacos地址配置到bootstrap.yaml中,那么在项目引导阶段就可以读取nacos中的配置了。

引入依赖:

XML 复制代码
  <!--nacos配置管理-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>
  <!--读取bootstrap文件-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>

新建bootstrap.yaml

XML 复制代码
spring:
  application:
    name: cart-service # 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 192.168.150.101 # nacos地址
      config:
        file-extension: yaml # 文件后缀名
        shared-configs: # 共享配置
          - dataId: shared-jdbc.yaml # 共享mybatis配置
          - dataId: shared-log.yaml # 共享日志配置
          - dataId: shared-swagger.yaml # 共享日志配置

重启服务后, nacos上的数据库配置就生效了


配置热更新

有很多的业务相关参数,将来可能会根据实际情况临时调整。例如购物车业务,购物车数量有一个上限,默认是10,我们在代码里不应该将10写死,我们应该将其配置在配置文件中,方便后期修改

但现在的问题是,即便写在配置文件中,修改了配置还是需要重新打包、重启服务才能生效。能不能不用重启,直接生效呢?

这就要用到Nacos的配置热更新能力了,分为两步:

  • 在Nacos中添加配置

  • 在微服务读取配置

首先,我们在nacos中添加一个配置文件,将购物车的上限数量添加到配置中:

注意文件的dataId格式:

XML 复制代码
[服务名]-[spring.active.profile].[后缀名]

文件名称由三部分组成:

  • 服务名 :我们是购物车服务,所以是cart-service

  • spring.active.profile :就是spring boot中的spring.active.profile,可以省略,则所有profile共享该配置

  • 后缀名:例如yaml


接着,我们在微服务中读取配置,实现配置热更新。

cart-service中新建一个属性读取类:

java 复制代码
package com.hmall.cart.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {
    private Integer maxAmount;
}

接着,在业务中使用该属性加载类:

相关推荐
良逍Ai出海1 天前
OpenClaw 新手最该先搞懂的 2 套命令
android·java·数据库
Keanu-1 天前
Redis 主从复制及哨兵模式配置
服务器·数据库·redis
blues92571 天前
【JOIN】关键字在MySql中的详细使用
数据库·mysql
x-cmd1 天前
[260307] x-cmd v0.8.6:新增 gpt-5.4 模型支持,sudo/os/hostname/cpu 等模块文档更新
java·数据库·gpt·sudo·x-cmd·googel
JuneXcy1 天前
第10章 数据库的安全与保护
数据库·mysql
liqianpin11 天前
完美解决phpstudy安装后mysql无法启动
数据库·mysql
小Tomkk1 天前
化繁为简:Access 与 SQL 创新指南(第四篇)
数据库·sql
cyber_两只龙宝1 天前
【MySQL】MySQL主从复制架构
linux·运维·数据库·mysql·云原生·架构
D.不吃西红柿1 天前
【无标题】
数据库·database·ai编程·数据库设计
Dylan~~~1 天前
PostgreSQL 数据库性能问题定位完全指南
数据库·postgresql