Apollo入门
# Apollo 入门
# Apollo 简介
Apollo (opens new window) 是携程开源的一款 分布式配置中心,用于集中管理应用配置,支持热更新、权限控制、灰度发布等功能,适用于微服务架构中配置管理的场景。
Apollo 的主要特点包括
- 配置 集中管理,可视化修改;
- 支持 实时推送(热更新),客户端自动刷新;
- 支持配置 灰度发布;
- 支持多环境、多集群、多命名空间;
- 提供 版本回滚 功能;
- 支持 权限管理与审计日志。
Apollo 支持 4 个维度管理 Key-Value 格式的配置
- application (应用)
- environment (环境)
- cluster (集群)
- namespace (命名空间)
# Apollo 核心概念
- application (应用)
- 这个很好理解,就是实际使用配置的应用,Apollo 客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
- 关键字:appId
- environment (环境)
- 配置对应的环境,Apollo 客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
- 关键字:env
- cluster (集群)
- 一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
- 关键字:cluster
- namespace (命名空间)
- 一个应用下不同配置的分组,可以简单地把 namespace 类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC 配置文件,应用自身的配置文件等
- 关键字:namespaces
关系:应用包含多个环境,环境包含多个集群,集群中包含多个命名空间
命名空间注意事项
- 命名空间名全局唯一(比如两个应用不能都创建一个叫
common.json
的公共命名空间); - 公共命名空间建议统一在一个配置应用下维护,比如
common-config
; - 公共命名空间中的 key 如果与私有命名空间冲突,以 私有命名空间优先;
- 一个应用可以同时引用多个公共命名空间。
命名空间实战建议
场景 | 建议类型 |
---|---|
每个服务自己的业务配置 | 私有命名空间 |
多服务共享的 Redis、限流、开关等 | 公共命名空间 |
想以模块区分配置,如 log4j.yaml | 私有或公共皆可,取决于是否共享 |
想全局维护一些规则 | 公共命名空间 |
# 核心组件和架构
Apollo 的核心由以下几个模块组成:
- Config Service:提供配置读取、推送服务(对客户端)。
- Admin Service:提供配置管理功能(供 Portal 使用)。
- Portal:可视化管理界面。
- 客户端 SDK:集成在服务中,实现配置读取和监听更新。
Apollo 架构图如下:
+-----------+ +-----------------+
| Apollo |<------->| Config Service |
| Portal | +-----------------+
|
+-------------+
| AdminService|
+-------------+
1
2
3
4
5
6
7
2
3
4
5
6
7
客户端部署后,会通过 SDK 向 Config Service 拉取配置,并可实时监听配置变更。
# Apollo 与 Nacos 的对比
特性 | Apollo | Nacos |
---|---|---|
所属 | 携程开源 | 阿里开源 |
配置热更新 | 支持(默认开启) | 支持(需依赖 Spring Cloud) |
多命名空间支持 | 支持 | 支持 |
灰度发布 | 支持 | 不支持 |
权限管理 | 支持 | 简单支持 |
集群部署难度 | 相对复杂 | 较简单 |
配置格式支持 | 支持 Properties、YAML、JSON、XML 等 | 支持 Properties、YAML、JSON |
服务注册与发现 | 不支持(只管配置) | 支持(服务发现与配置中心二合一) |
简而言之:
- Apollo 更注重 配置管理能力,尤其适合配置量大、管理复杂的项目;
- Nacos 是一个 配置中心 + 注册中心 的统一平台,更适合 Spring Cloud 项目。
# Apollo 快速上手
# 环境准备
官方提供了 apollo-quick-start 项目 (opens new window),可以使用 Docker 快速部署。
# windows 环境启动
在 git bash 中,执行下面的启动命令:
export SPRING_PROFILES_ACTIVE="github,database-discovery,auth"
# 配置 ApolloConfigDB 数据库连接
unset SPRING_SQL_CONFIG_INIT_MODE
export SPRING_CONFIG_DATASOURCE_URL="jdbc:mysql://localhost:3306/apolloconfigdb?useUnicode=true&characterEncoding=utf8&useSSL=false"
export SPRING_CONFIG_DATASOURCE_USERNAME="root"
export SPRING_CONFIG_DATASOURCE_PASSWORD="123456"
# 配置 ApolloPortalDB 数据库连接
unset SPRING_SQL_PORTAL_INIT_MODE
export SPRING_PORTAL_DATASOURCE_URL="jdbc:mysql://localhost:3306/apolloportaldb?useUnicode=true&characterEncoding=utf8&useSSL=false"
export SPRING_PORTAL_DATASOURCE_USERNAME="root"
export SPRING_PORTAL_DATASOURCE_PASSWORD="123456"
java -jar apollo-all-in-one.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
或者执行启动脚本命令:
- ⚠️注意:这种命令启动无法直接通过
Ctrl + c
来关闭项目
# 启动
./demo.sh start
# 关闭
./demo.sh stop
1
2
3
4
5
2
3
4
5
启动成功后:
- Portal 地址: http://localhost:8070 (opens new window)
- 默认账号:
apollo
/admin
# 创建配置示例
进入 Portal:
- 创建一个新的应用(App Id 如
demo-java-app
); - 创建命名空间,如
application
; - 添加配置项:
user.name = apollo
user.age = 25
发布配置后,客户端即可拉取。
# 客户端接入
以 Spring Boot 为例,引入依赖:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>2.2.0</version>
</dependency>
1
2
3
4
5
2
3
4
5
在 application.properties
中配置:
app.id=demo-java-app
apollo.meta=http://localhost:8080
1
2
2
读取配置方式有两种:
# 方式一:使用 @Value
@Value("${user.name}")
private String userName;
1
2
2
# 方式二:使用 Config
API
Config config = ConfigService.getAppConfig();
String userName = config.getProperty("user.name", "defaultName");
1
2
2
# 支持配置变更监听
config.addChangeListener(changeEvent -> {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.printf("Found change - key: %s, oldValue: %s, newValue: %s%n",
change.getPropertyName(), change.getOldValue(), change.getNewValue());
}
});
1
2
3
4
5
6
7
2
3
4
5
6
7
# 使用 Spring Boot Starter(推荐)
引入 Starter:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client-config-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
1
2
3
4
5
2
3
4
5
Spring Boot 项目将自动启用 Apollo 配置,application.properties
中配置好 app.id
和 apollo.meta
即可。
# 实践建议
- 配置分类建议使用多个命名空间(如 DB 配置、线程池配置、开关配置分开管理);
- 线上配置发布建议启用审计、灰度发布功能,避免全量影响;
- 定期使用回滚功能测试变更的安全性;
- 警惕误删配置项,可以启用强制发布审核流程。
# 学习参考
上次更新: 2025/7/25 19:14:44