核心概念: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 对应一个应用
- 一个应用可以在多个 Env 中运行
- 每个 Env 下可以有多个 Cluster
- 每个 Cluster 下可以有多个 Namespace
- 每个 Namespace 里放着具体的 配置项
7. 实际项目中的最佳实践
说了这么多理论,来点实际的。我在一个电商项目中是这样用的:
- AppId:每个微服务一个,比如
order-service、user-service - Env:DEV、FAT、UAT、PRO 各一套
- Cluster:PRO 环境下分 bj、sh 两个集群,其他环境用 default
- Namespace:每个服务至少三个——application、common.datasource、common.redis
- 配置项:统一命名规范,比如
模块名.功能名.属性名
一个小技巧:配置项的 Value 尽量用 JSON 格式,这样后期扩展字段时不用改 Key。比如 order.config = {"timeout":30000, "retry":3},比拆成多个配置项灵活得多。
好了,这几个核心概念就讲到这里。你只要记住一句话:AppId 找应用,Env 分环境,Cluster 分集群,Namespace 分模块,配置项是最终的数据。搞清楚了这些,Apollo 的配置管理你就入门了。