分布式配置中心

Spring Cloud Config、Nacos、Apollo 配置中心对比,配置热更新与灰度发布实践。

分布式配置中心

在微服务架构中,管理数十乃至上百个服务的配置是一项挑战。配置中心统一管控配置,支持动态更新与灰度发布。

1. 为什么需要配置中心

痛点配置中心解决方式
配置散落各处集中存储与管理
修改需重启热更新、实时推送
多环境混乱环境隔离、命名空间
无变更审计版本管理与操作日志
敏感信息泄露加密存储与权限控制

2. 核心能力对比

能力Spring ConfigNacosApollo
配置推送依赖 Bus/Webhook长轮询秒级长轮询秒级
灰度发布不支持部分完善(灰度规则)
版本管理Git 版本历史版本发布历史+回滚
权限控制命名空间级细粒度 RBAC
多集群ProfileNamespaceCluster + Namespace
控制台完善
配置校验语法校验

3. Apollo 详解

携程开源,功能最完善的配置中心。

架构

┌─────────┐     ┌──────────────┐     ┌─────────┐
│ Portal  │ ←→ │ Admin Service│ ←→ │ ConfigDB│
│ (管理端)│     │ (元数据管理)  │     │ (MySQL) │
└─────────┘     └──────────────┘     └─────────┘
                      ↑
               ┌────────────────┐
               │ Config Service │ ←→ Apollo Client
               │ (配置推送)      │     (长轮询)
               └────────────────┘

灰度发布

配置发布流程:

1. 创建灰度规则(按 AppID/IP/Label)
2. 灰度配置发布(仅灰度实例生效)
3. 监控验证
4. 全量发布或回滚

客户端集成

// Spring Boot 自动刷新
@Configuration
@EnableApolloConfig("application")
public class AppConfig {
    @ApolloConfigChangeListener
    public void onChange(ConfigChangeEvent event) {
        // 自定义刷新逻辑
    }
}

4. Nacos 配置中心

注册发现 + 配置管理一体化。

核心概念

概念说明
Namespace环境隔离(dev/test/prod)
Group逻辑分组
Data ID配置唯一标识:${prefix}-${spring.profiles.active}.${format}

配置监听

// 方式一:@NacosValue + 自动刷新
@NacosValue(value = "${timeout:1000}", autoRefreshed = true)
private int timeout;

// 方式二:@NacosConfigurationProperties
@NacosConfigurationProperties(dataId = "order-service.yaml", autoRefreshed = true)
@Configuration
public class OrderProperties {
    private int maxItems;
}

5. Spring Cloud Config

# 服务端:Git 后端
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/company/config-repo
          searchPaths: '{application}'

# 客户端
spring:
  config:
    import: "optional:configserver:http://config:8888"
  cloud:
    config:
      name: order-service
      profile: dev

6. 配置热更新原理

推送方式

方式原理延迟资源消耗
长轮询HTTP 挂起,有变更即时返回<1s中等
定时轮询定时拉取5-30s
推送(WebSocket)服务端主动推送实时

Spring 热刷新

@ConfigurationProperties(prefix = "order")
@RefreshScope  // ← 关键注解,刷新时重建 Bean
public class OrderConfig {
    private int maxRetries;
    private Duration timeout;
}

配置变更事件

@EventListener
public void handleRefresh(RefreshScopeRefreshedEvent event) {
    log.info("配置已刷新: {}", event.getName());
    // 刷新本地缓存、重置连接池等
}

7. 敏感配置安全

策略实现
配置加密Apollo 自动加密 + 运行时解密
密钥分离敏感配置使用独立加密 Key
最小权限仅管理员可查看生产配置
审计日志记录所有配置查看/修改操作
// Jasypt 加密示例
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD}

# 加密后的数据库密码
db.password=ENC(encrypted_value)

8. 最佳实践

  1. 配置即代码:变更走审批流程,禁止在控制台直接修改生产配置
  2. 环境隔离:不同环境使用不同 Namespace,不共享配置
  3. 版本管理:重要配置变更保留历史版本,支持快速回滚
  4. 分级发布:先灰度验证,再全量发布
  5. 降级兜底:本地缓存配置,配置中心故障时使用本地值

总结

场景推荐
功能全面、灰度发布Apollo
与 Nacos 注册中心配套Nacos
Spring Cloud 简洁方案Spring Config
云原生、轻量级Kubernetes ConfigMap + Secret

配置管理的核心目标是让配置变更安全、可控、可追溯。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「架构」更多文章

  1. 架构评审与技术债管理
  2. SLA/SLO/SLI 与容量规划
  3. 云原生架构模式