核心概念:Namespace、Cluster、Env、AppId 与配置项

说实话,刚接触 Apollo 的时候,我被这几个概念绕晕过。

Namespace 是什么?Cluster 又是什么?Env 和环境变量是一回事吗?

别急,我一个个给你拆开讲。搞懂了这些,Apollo 的配置管理逻辑你就拿捏了八成。

1. AppId:你的应用身份证

每个接入 Apollo 的应用,都必须有一个唯一的 AppId。你可以把它理解成应用的身份证号。

我在项目中遇到过好几次,新同学上来就复制粘贴别人的 AppId,结果配置全乱套了。嗯,这其实是个很隐蔽的坑。

AppId 的命名规范:

  • 全局唯一,不能重复
  • 建议用业务缩写 + 模块名,比如 order-service、user-center
  • 一旦确定,尽量不要修改

在代码里,AppId 通常配置在 application.properties 或 bootstrap.yml 中:

# application.properties
app.id = order-service
apollo.meta = http://localhost:8080

2. Env(环境):开发、测试、生产,各玩各的

Env 就是环境,说白了就是你的配置跑在哪个“地盘”上。

Apollo 默认支持四个环境:

环境名称 缩写 典型用途
DEV 开发环境 本地调试、功能开发
FAT 测试环境 功能测试、集成测试
UAT 预发布环境 用户验收测试
PRO 生产环境 线上正式运行

你想想看,开发环境配个调试日志级别,生产环境肯定不能这么干。Env 就是帮你隔离这些差异的。

我的习惯:每个环境单独部署一套 Apollo 服务端,数据完全隔离。虽然麻烦点,但安全。

3. Cluster(集群):同环境下的“分身术”

Cluster 是 Env 下面的子概念。同一个环境里,你可以划分多个集群。

举个例子:

  • 生产环境(PRO)下,可能有 北京集群 和 上海集群
  • 两个集群的数据库地址、缓存配置可能不一样
  • 但业务逻辑配置是相同的

我曾经在跨机房部署时吃过亏。两个机房的 Redis 地址不同,但配置写死了。后来用 Cluster 区分,一个配置搞定两个机房,省心多了。

注意:Cluster 不是必须的。如果你的应用没有多机房、多区域的需求,用默认的 default 集群就行。

4. Namespace(命名空间):配置的“文件夹”

Namespace 是 Apollo 里最灵活、也最容易让人迷惑的概念。

你可以把它想象成一个文件夹,里面放着一组相关的配置项。

Apollo 有三种 Namespace 类型:

类型 说明 使用场景
私有类型 只能被所属应用读取 应用自身的配置
公共类型 可以被多个应用共享 公共组件、基础库的配置
关联类型 引用其他 Namespace 配置复用、继承

我个人的习惯是:

  • 数据库、缓存等基础配置,放在公共 Namespace 里
  • 业务开关、阈值等,放在私有 Namespace 里
  • 不同模块的配置,拆成不同的 Namespace

举个例子,一个订单服务可能有三个 Namespace:

application(私有)—— 订单超时时间、支付开关
common.datasource(公共)—— 数据库连接信息
common.redis(公共)—— Redis 配置

5. 配置项:最细粒度的配置单元

配置项就是一个个具体的 key-value 对。比如:

order.timeout = 30000
order.payment.switch = true
order.max.retry = 3

每个配置项都有几个属性:

  • Key:配置名称,建议用点号分隔的命名方式
  • Value:配置值,支持字符串、数字、JSON 等格式
  • 格式:properties、xml、yml、json 等
  • 备注:说明这个配置是干嘛的

避坑指南:我曾经把配置项的 Key 写成了驼峰命名,结果和其他团队的习惯不一致,排查问题花了半天。建议团队统一命名规范,比如全小写 + 点号分隔。

6. 它们之间的关系

这几个概念的关系,我用一张图来展示:

AppId: order-service Env: DEV | FAT | UAT | PRO Cluster: default | bj-cluster | sh-cluster Namespace: application | common.datasource | common.redis 配置项: order.timeout = 30000 配置项: order.payment.switch = true AppId Env Cluster Namespace 配置项

从上往下看,层级关系很清楚:

  • 一个 AppId 对应一个应用
  • 一个应用可以在多个 Env 中运行
  • 每个 Env 下可以有多个 Cluster
  • 每个 Cluster 下可以有多个 Namespace
  • 每个 Namespace 里放着具体的 配置项

7. 实际项目中的最佳实践

说了这么多理论,来点实际的。我在一个电商项目中是这样用的:

  1. AppId:每个微服务一个,比如 order-service、user-service
  2. Env:DEV、FAT、UAT、PRO 各一套
  3. Cluster:PRO 环境下分 bj、sh 两个集群,其他环境用 default
  4. Namespace:每个服务至少三个——application、common.datasource、common.redis
  5. 配置项:统一命名规范,比如 模块名.功能名.属性名

一个小技巧:配置项的 Value 尽量用 JSON 格式,这样后期扩展字段时不用改 Key。比如 order.config = {"timeout":30000, "retry":3},比拆成多个配置项灵活得多。

好了,这几个核心概念就讲到这里。你只要记住一句话:AppId 找应用,Env 分环境,Cluster 分集群,Namespace 分模块,配置项是最终的数据。搞清楚了这些,Apollo 的配置管理你就入门了。

可可精品资料库