什么是 Nacos 配置中心?
**简单说:**把配置文件放到 Nacos 服务器上,应用启动时自动拉取,修改后自动刷新,不用重启应用。
好处:
- 配置集中管理,不用改代码;
- 支持动态刷新,修改立即生效;
- 多环境隔离(dev/test/prod);
- 敏感信息不提交代码库。
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 | 可能需要动态调整 |
| 端口号 | 本地 | 启动时就需要,不能动态改 |
| 静态常量 | 本地 | 不需要动态修改 |