5-1 配置中心

4 阅读2分钟

5-1 配置中心

概念解析

主流配置中心对比

方案特性优点缺点
Nacos配置+注册中心功能全面阿里系绑定
Apollo配置管理完善的用户权限学习成本高
Spring Cloud ConfigGit 后端简单无界面
Disconf百度开源功能完善已停止维护

Nacos vs Apollo

维度NacosApollo
配置持久化MySQLMySQL
配置推送HTTP Long PollingHTTP Long Polling
多环境Namespace + GroupEnvironment + 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 配置中心的工作原理?

参考答案

  1. 启动拉取:应用启动时从 Nacos 拉取配置
  2. 长轮询:定期通过 HTTP Long Polling 拉取配置变更
  3. 本地缓存:配置缓存在本地文件
  4. 变更通知:Nacos 有变更时推送给客户端
  5. 动态生效:通过 @RefreshScope 重新创建 Bean

Q2:如何实现配置的灰度发布?

参考答案

Nacos 灰度配置

  • 配置不同 profile 版本
  • 使用 canary-configs 灰度配置
  • 根据用户 ID 或 IP 进行灰度路由
# Nacos 灰度规则
app:
  version: canary-10%  # 10% 流量使用新配置

Q3:配置中心与配置文件的区别?

参考答案

维度配置文件配置中心
修改方式改代码/重新部署Web UI 实时修改
生效方式重启无需重启
多环境需要多套文件命名空间隔离
审计配置变更历史
权限细粒度权限控制