SpringCloud-Nacos 配置中心实战

什么是 Nacos 配置中心?

**简单说:**把配置文件放到 Nacos 服务器上,应用启动时自动拉取,修改后自动刷新,不用重启应用。

好处:

  1. 配置集中管理,不用改代码;
  2. 支持动态刷新,修改立即生效;
  3. 多环境隔离(dev/test/prod);
  4. 敏感信息不提交代码库。
bash 复制代码
📁 需要的文件

项目中:
├── pom.xml                           # 添加依赖
├── bootstrap.yml                     # Nacos连接配置(必须是bootstrap)
└── com/payslip/config/
    └── DataSourceConfig.java         # 配置类

Nacos中:
└── payslip-api-db.yml               # 数据库配置

Step1:添加依赖(pom.xml)

java 复制代码
<!-- Nacos 配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 配置自动刷新需要 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

Step 2:配置 Nacos 连接(bootstrap.yml)

java 复制代码
⚠️ 必须是 bootstrap.yml,不是 application.yml! 因为 Nacos 配置要在 Spring 容器启动前加载。
spring:
  application:
    name: payslip-api  # 应用名,Nacos会用这个匹配配置
  
  cloud:
    nacos:
      config:
        server-addr: 192.168.3.12:8848  # Nacos服务器地址
        namespace: dev                   # 命名空间(环境隔离)
        group: gzg                       # 分组
        file-extension: yml              # 配置文件格式
        
        # 扩展配置(加载多个配置文件)
        extension-configs:
          - data-id: payslip-api-db.yml      # 数据库配置
            group: gzg
            refresh: true                     # 支持动态刷新
          - data-id: payslip-api-redis.yml   # Redis配置
            group: gzg
            refresh: true

  profiles:
    active: dev  # 当前环境

Step 3:在 Nacos 控制台创建配置

java 复制代码
3.1 登录 Nacos
地址:http://192.168.3.12:8848/nacos
账号:nacos
密码:nacos
3.2 创建配置
点击 配置管理 → 配置列表 → + 创建配置

| 字段 | 值 | |------|-----| | Data ID | payslip-api-db.yml | | Group | gzg | | 配置格式 | YAML |

3.3 配置内容
# 数据库配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/payslip_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    
    # HikariCP 连接池配置
    hikari:
      minimum-idle: 5
      maximum-pool-size: 20
      idle-timeout: 30000
      connection-timeout: 30000
      max-lifetime: 1800000

Step 4:代码中使用配置

方式一:@Value 直接注入(简单)
java 复制代码
@Service
public class SomeService {
    
    @Value("${spring.datasource.url}")
    private String dbUrl;
    
    @Value("${spring.datasource.username}")
    private String dbUsername;
    
    // 使用...
}
方式二:@ConfigurationProperties 批量绑定(推荐)
java 复制代码
package com.payslip.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;

/**
 * 数据源配置
 * 
 * 【核心注解说明】
 * @Configuration: 声明这是一个配置类
 * @ConfigurationProperties: 批量绑定配置,prefix指定前缀
 * @RefreshScope: 支持动态刷新(Nacos修改后自动更新)
 * @Data: Lombok,自动生成getter/setter
 */
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
@RefreshScope  // ⭐ 关键!支持动态刷新
@Data
public class DataSourceConfig {
    
    /** 数据库连接URL */
    private String url;
    
    /** 用户名 */
    private String username;
    
    /** 密码 */
    private String password;
    
    /** 驱动类名 */
    private String driverClassName;
    
    /** HikariCP连接池配置 */
    private HikariConfig hikari;
    
    @Data
    public static class HikariConfig {
        private Integer minimumIdle;
        private Integer maximumPoolSize;
        private Long idleTimeout;
        private Long connectionTimeout;
        private Long maxLifetime;
    }
}
**方式三:**在其他类中使用配置
java 复制代码
@Service
@Slf4j
public class DatabaseService {
    
    @Autowired
    private DataSourceConfig dataSourceConfig;
    
    public void printConfig() {
        log.info("数据库URL: {}", dataSourceConfig.getUrl());
        log.info("用户名: {}", dataSourceConfig.getUsername());
        // 密码不要打印!
    }
}

Step 5:测试动态刷新

5.1 写一个测试接口
java 复制代码
@RestController
@RequestMapping("/api/config")
public class ConfigTestController {
    
    @Autowired
    private DataSourceConfig dataSourceConfig;
    
    @Value("${spring.datasource.url}")
    private String dbUrl;
    
    /**
     * 查看当前配置
     * GET /api/config/datasource
     */
    @GetMapping("/datasource")
    public Map<String, Object> getDataSourceConfig() {
        Map<String, Object> result = new HashMap<>();
        result.put("url", dataSourceConfig.getUrl());
        result.put("username", dataSourceConfig.getUsername());
        result.put("maxPoolSize", dataSourceConfig.getHikari().getMaximumPoolSize());
        return result;
    }
}
5.2 测试步骤
java 复制代码
# 1. 启动应用
# 2. 调用接口查看配置
curl http://localhost:8080/api/config/datasource
# 返回: {"url":"jdbc:mysql://localhost:3306/payslip_db...", "maxPoolSize":20}

# 3. 在 Nacos 控制台修改配置
# 把 maximum-pool-size 改成 50

# 4. 等待几秒(默认3秒刷新)

# 5. 再次调用接口
curl http://localhost:8080/api/config/datasource
# 返回: {"url":"...", "maxPoolSize":50}  ← 自动更新了!

核心知识点

Nacos 配置匹配规则
java 复制代码
Data ID 格式: ${spring.application.name}-${spring.profiles.active}.${file-extension}
例如:
应用名: payslip-api
环境: dev
格式: yml

Nacos会自动加载:
1. payslip-api.yml           (公共配置)
2. payslip-api-dev.yml       (环境配置,优先级更高)
@RefreshScope 原理
java 复制代码
1. Nacos 配置变更
      ↓
2. Nacos 推送变更事件
      ↓
3. Spring Cloud 接收事件
      ↓
4. 销毁 @RefreshScope 标注的 Bean
      ↓
5. 重新创建 Bean(使用新配置)
      ↓
6. 配置更新完成
常见配置项
java 复制代码
# bootstrap.yml 完整示例
spring:
  application:
    name: payslip-api
    
  cloud:
    nacos:
      config:
        server-addr: 192.168.3.12:8848
        namespace: dev              # 命名空间ID(不是名称!)
        group: gzg                  # 分组
        file-extension: yml         # 文件格式
        refresh-enabled: true       # 是否开启动态刷新
        
        # 共享配置(多个服务共用)
        shared-configs:
          - data-id: common.yml
            group: COMMON
            refresh: true
            
        # 扩展配置(当前服务专用)
        extension-configs:
          - data-id: payslip-api-db.yml
            group: gzg
            refresh: true
配置优先级(从低到高)
java 复制代码
1. 本地 application.yml
2. Nacos 共享配置 (shared-configs)
3. Nacos 扩展配置 (extension-configs)
4. Nacos ${application.name}.yml
5. Nacos ${application.name}-${profile}.yml  ← 最高优先级
常见问题
java 复制代码
1. 配置没有加载
检查:
- 是否用的 bootstrap.yml(不是 application.yml)
- namespace 是否正确(要用ID,不是名称)
- Data ID 和 Group 是否匹配
- Nacos 服务是否正常
2. 动态刷新不生效
检查:
- 是否加了 @RefreshScope
- extension-configs 中 refresh 是否为 true
- 配置类是否被 Spring 管理(@Configuration/@Component)
3. 敏感信息安全
建议:
- 数据库密码等敏感信息只放 Nacos,不提交代码
- Nacos 开启鉴权
- 使用加密配置(Nacos 支持)
实际应用场景
java 复制代码
| 配置类型 | 放哪里 | 原因 | |---------|--------|------| 
| 数据库连接 | Nacos | 不同环境不同,敏感 | 
| Redis配置 | Nacos | 不同环境不同 | 
| 第三方API密钥 | Nacos | 敏感信息 | 
| 日志级别 | Nacos | 可能需要动态调整 | 
| 端口号 | 本地 | 启动时就需要,不能动态改 |
| 静态常量 | 本地 | 不需要动态修改 |
相关推荐
java1234_小锋3 小时前
[免费]SpringBoot+Vue勤工助学管理系统【论文+源码+SQL脚本】
spring boot·后端·mybatis·勤工助学
踏浪无痕4 小时前
从 Guava ListenableFuture 学习生产级并发调用实践
后端·面试·架构
❀͜͡傀儡师4 小时前
SpringBoot 扫码登录全流程:UUID 生成、状态轮询、授权回调详解
java·spring boot·后端
可观测性用观测云4 小时前
观测云在企业应用性能故障分析场景中的最佳实践
后端
一 乐4 小时前
酒店预约|基于springboot + vue酒店预约系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
我是谁的程序员5 小时前
iOS CPU 占用率在性能问题中的表现形式
后端
一灰灰5 小时前
开发调试与生产分析的利器:MyBatis SQL日志合并插件,让复杂日志秒变可执行SQL
chrome·后端·mybatis
Code blocks5 小时前
SpringBoot从0-1集成Minio对象存储
java·spring boot·后端