5-1 配置中心
概念解析
主流配置中心对比
| 方案 | 特性 | 优点 | 缺点 |
|---|---|---|---|
| Nacos | 配置+注册中心 | 功能全面 | 阿里系绑定 |
| Apollo | 配置管理 | 完善的用户权限 | 学习成本高 |
| Spring Cloud Config | Git 后端 | 简单 | 无界面 |
| Disconf | 百度开源 | 功能完善 | 已停止维护 |
Nacos vs Apollo
| 维度 | Nacos | Apollo |
|---|---|---|
| 配置持久化 | MySQL | MySQL |
| 配置推送 | HTTP Long Polling | HTTP Long Polling |
| 多环境 | Namespace + Group | Environment + Cluster |
| 权限控制 | ACL | 更完善 |
代码示例
1. Nacos 配置中心
pom.xml 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2023.0.1.0</version>
</dependency>
bootstrap.yml
spring:
application:
name: order-service
cloud:
nacos:
server-addr: localhost:8848
username: nacos
password: nacos
config:
namespace: dev # 命名空间
group: DEFAULT_GROUP # 分组
file-extension: yaml
refresh-enabled: true
shared-configs:
- data-id: common.yaml
group: COMMON_GROUP
refresh: true
配置获取
@RestController
@RefreshScope // 支持动态刷新
public class ConfigController {
@Value("${app.name}")
private String appName;
@Value("${app.version}")
private String version;
@GetMapping("/config")
public Result<Map<String, String>> getConfig() {
Map<String, String> config = new HashMap<>();
config.put("appName", appName);
config.put("version", version);
return Result.success(config);
}
}
2. 配置热更新
方式一:@RefreshScope
@Component
@RefreshScope
@Data
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private int maxCount;
// getters/setters
}
方式二:@ConfigurationProperties + Actuator
management:
endpoints:
web:
exposure:
include: refresh
# POST 请求触发刷新
curl -X POST http://localhost:8080/actuator/refresh
3. 多环境配置
# bootstrap.yml
spring:
cloud:
nacos:
config:
# 支持多环境共享配置
shared-configs:
- data-id: common.yaml
group: COMMON_GROUP
refresh: true
- data-id: database.yaml
group: COMMON_GROUP
refresh: true
# Nacos 命名空间结构
# Namespace: dev / test / prod
# └── Group: DEFAULT_GROUP / COMMON_GROUP
# └── Data ID: order-service-dev.yaml
4. 配置优先级
# Nacos 中的配置优先级(从高到低)
1. ${spring.application.name}-${profile}.${file-extension}
2. ${spring.application.name}.${file-extension}
3. shared-dataids 共享配置
4. extension-config 扩展配置
5. 配置加密
@Configuration
public class DecryptConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DataSource dataSource(DataSourceProperties properties) {
// 解密密码
HikariDataSource dataSource = properties.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
String password = dataSource.getPassword();
dataSource.setPassword(decrypt(password));
return dataSource;
}
private String decrypt(String encrypted) {
// 使用 AES 等算法解密
return AESUtil.decrypt(encrypted, secretKey);
}
}
常见坑点
⚠️ 坑 1:配置不生效
# ❌ 缺少 bootstrap.yml/application.yml
# Spring Cloud 必须有 bootstrap 上下文才能加载配置中心
# ✅ 确保有 bootstrap.yml
spring:
cloud:
nacos:
server-addr: localhost:8848
⚠️ 坑 2:@Value 不支持动态刷新
// ❌ 静态字段无法动态更新
private static String name;
// ✅ 使用 @RefreshScope
@Component
@RefreshScope
public class ConfigHolder {
@Value("${app.name}")
private String name;
}
⚠️ 坑 3:Nacos 连接失败
# 检查 Nacos 服务状态
curl http://localhost:8848/nacos/v1/console/health
# 检查网络连通性
telnet localhost 8848
面试题
Q1:Nacos 配置中心的工作原理?
参考答案:
- 启动拉取:应用启动时从 Nacos 拉取配置
- 长轮询:定期通过 HTTP Long Polling 拉取配置变更
- 本地缓存:配置缓存在本地文件
- 变更通知:Nacos 有变更时推送给客户端
- 动态生效:通过 @RefreshScope 重新创建 Bean
Q2:如何实现配置的灰度发布?
参考答案:
Nacos 灰度配置:
- 配置不同 profile 版本
- 使用
canary-configs灰度配置 - 根据用户 ID 或 IP 进行灰度路由
# Nacos 灰度规则
app:
version: canary-10% # 10% 流量使用新配置
Q3:配置中心与配置文件的区别?
参考答案:
| 维度 | 配置文件 | 配置中心 |
|---|---|---|
| 修改方式 | 改代码/重新部署 | Web UI 实时修改 |
| 生效方式 | 重启 | 无需重启 |
| 多环境 | 需要多套文件 | 命名空间隔离 |
| 审计 | 无 | 配置变更历史 |
| 权限 | 无 | 细粒度权限控制 |