配置中心

配置中心负责微服务的动态配置管理:配置统一存储、版本管理、变更推送、灰度发布。让应用配置与代码分离,无需重启即可生效。

为什么需要配置中心

传统做法(properties / yaml 写死在包内):
  - 改配置 = 重新打包 + 重启
  - 多环境配置散落,难管理
  - 无变更审计

K8s ConfigMap / Secret:
  - 解决静态配置和注入
  - 但应用要重启或重新挂载才能感知

配置中心:
  - 实时推送,秒级生效
  - 灰度发布(不同实例不同配置)
  - 配置版本管理 + 一键回滚
  - 权限与审计
  - 加密敏感配置

核心能力

开发者 / 运维
   │ 修改配置(控制台 / Git PR)
   ▼
配置中心 Server
   │  长轮询 / WebSocket / gRPC 推送
   ▼
应用实例
   │  本地缓存 + 监听变更
   ▼
业务代码读取(@Value / @ConfigurationProperties)
能力说明
动态刷新配置变更秒级推送到所有实例
多环境管理dev / test / staging / prod 隔离
多租户不同业务线/团队隔离
灰度发布按 IP / Label 推送给部分实例
版本管理历史版本、Diff、一键回滚
加密敏感字段加密存储
审计谁、何时、改了什么
监听通知配置变更 → 触发自定义回调

主流方案对比

方案一致性推送机制配置 + 注册适用生态
NacosAP / CP 可切换长轮询 / 推送✅ 一体Spring Cloud / Dubbo
Apollo最终一致长轮询❌ 仅配置Java 微服务
ConsulCP(Raft)Watch✅ 一体多语言、Hashicorp
etcdCP(Raft)Watch❌ 偏 KVK8s 底层
Spring Cloud Config依赖 GitBus 广播❌ 仅配置Spring Cloud 早期
K8s ConfigMapetcdreload 文件 / 重启❌ 仅配置K8s 原生

Nacos 架构(国内主流)

┌──────────────────────────────────────┐
│           Nacos Server               │
│         (集群 3 节点以上)           │
│                                      │
│  ┌──────────────────────────────┐    │
│  │   配置中心                    │    │
│  │   DataId + Group + Tenant     │    │
│  └──────────────────────────────┘    │
│  ┌──────────────────────────────┐    │
│  │   注册中心                    │    │
│  │   服务实例 + 健康检查          │    │
│  └──────────────────────────────┘    │
│                                      │
│  存储:MySQL(配置) + 内存(实例)    │
└──────────────────────────────────────┘
           │ 长轮询 / 推送
           ▼
   ┌──────┴──────────────────┐
   ▼                          ▼
应用实例 A                应用实例 B
(本地缓存 + 监听)       (本地缓存 + 监听)

核心概念:

概念说明
Namespace环境隔离(dev / prod)
Group业务分组
DataId配置文件唯一标识
Tenant多租户

配置示例(Spring Boot):

# bootstrap.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      config:
        server-addr: nacos:8848
        namespace: prod
        group: ORDER_GROUP
        file-extension: yaml
        refresh-enabled: true
@RestController
@RefreshScope          // 配置变更自动刷新
public class OrderController {
    @Value("${order.timeout}")
    private int timeout;
}

Apollo 架构(携程开源)

┌─────────────────────────────────────┐
│          Apollo 三大组件             │
│                                     │
│  Config Service(配置读取 + 推送)   │
│  Admin Service(配置管理)          │
│  Portal(管理界面)                 │
│                                     │
│  存储:MySQL(ApolloConfigDB +      │
│             ApolloPortalDB)        │
└─────────────────────────────────────┘
           │ 长轮询
           ▼
       客户端 SDK

Apollo 特色:

  • 灰度发布(按 IP / Label 推送)
  • 审计与权限(修改 / 发布权限分离)
  • 命名空间继承(公共配置复用)
  • 配置 Diff 对比

推送机制对比

长轮询(Long Polling)

客户端 ──── HTTP 请求(带超时 30s)────► 配置中心
                                          │
                  无变更 → 等待 30s        │
                  有变更 → 立即返回新配置  │
客户端 ◄────────────────────────────────  │
   │
   ▼
处理配置变更,继续下一轮长轮询

Apollo、Nacos 默认使用,兼容性好,无需 WebSocket。

Watch 机制(gRPC Stream)

客户端 ──── 建立 gRPC 流 ────► 配置中心
                                  │ 变更
客户端 ◄──── 推送变更 ─────────── │

Consul、etcd、Nacos 2.x 默认。延迟更低。

与 K8s ConfigMap 的关系

ConfigMap 局限:

  • 修改后 Pod 不自动 reload(需手动 rollout restart)
  • 没有版本管理 / 审计
  • 没有权限隔离
  • 没有灰度

两种集成方式:

方案 1:ConfigMap + Reloader

ConfigMap 修改
   │
Reloader Operator 检测变更
   │
   ▼
触发 Deployment rollout restart
   │
所有 Pod 滚动重启

简单粗暴,仅适合非核心服务。

方案 2:Nacos / Apollo + K8s 应用

K8s Pod(应用)
   │  Init Container 从 Nacos 拉初始配置
   │  Sidecar 长轮询 Nacos 推送变更
   ▼
应用进程(不重启,热刷新配置)

生产推荐方案,结合 K8s 编排 + 配置中心实时性。

配置最佳实践

配置分类与存储位置

类型存储示例
启动配置镜像 / ConfigMap端口、日志路径
业务配置配置中心限流阈值、开关、特性标志
敏感配置Vault / KMS数据库密码、API Key
公共配置配置中心(公共 namespace)监控地址、链路追踪开关

命名规范

{环境}/{服务}/{配置类别}
  prod/order-service/business
  prod/order-service/database
  dev/order-service/business

配置变更安全

1. 变更前:在 staging 验证
2. 灰度发布:先推 5% 实例
3. 监控指标:error rate、latency 是否异常
4. 异常 → 自动回滚(Apollo 支持)
5. 全量推送

危险配置项保护

# 关键阈值配置必须人工 review
order:
  max-amount: 100000   # 单笔限额
  rate-limit: 1000     # QPS 上限

通过权限控制 + 二次审批,防止误操作。

Feature Flag(特性开关)

配置中心常被用于实现 Feature Flag,灰度上线新功能:

features:
  new-checkout-flow:
    enabled: true
    rollout:
      percentage: 10        # 10% 用户启用
      whitelist: [123, 456] # 指定用户启用
if (featureFlag.isEnabled("new-checkout-flow", userId)) {
    return newCheckout();
} else {
    return oldCheckout();
}

专门的 Feature Flag 平台:

  • LaunchDarkly(商业)
  • Unleash(开源)
  • Flagsmith(开源)

安全注意事项

风险防护
敏感配置泄露加密存储(AES)+ 传输 TLS
权限滥用RBAC + 审批流
误删 / 误改版本管理 + 一键回滚
配置爆炸命名规范 + 定期清理
配置中心宕机客户端本地缓存兜底 + 多副本部署

与注册中心的关系

参见 服务注册与发现。Nacos 同时承担配置中心 + 注册中心两个职责,部署一套即可:

┌─────────────────────────────────────┐
│            Nacos                    │
│                                     │
│   配置中心:DataId / Group / Tenant  │
│   注册中心:Service / Instance       │
│                                     │
│   两者共享:权限、命名空间、集群       │
└─────────────────────────────────────┘

相比 Apollo(仅配置) + Eureka(仅注册),Nacos 一体化更易运维,这也是它成为国内主流的核心原因。