Apollo 配置中心:携程开源配置管理平台
yaml version: '3' services: apollo-quick-start: image: apolloconfig/apollo-quick-start:latest container_name: apollo-quick-start ports: - "8080:8080" # Portal - "8070:8070" # Config & Admin environment: - EUREKA_INSTANCE_IP_ADDRESS=宿主机IP volumes: - ./apollo/logs:/opt/logs depends_on: - apollo-db apollo-db: image: mysql:5.7 container_name: apollo-db environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: ApolloPortalDB ports: - "13307:3306" volumes: - ./sql:/docker-entrypoint-initdb.d
需要提前将官方提供的 `apolloportaldb.sql` 和 `apolloconfigdb.sql` 放入 `./sql` 目录。
2. 执行 `docker-compose up -d`,稍等片刻,访问 `http://宿主机IP:8080`,使用默认账号 `apollo/admin` 登录。
3. 在 Portal 中即可创建项目、添加配置,完成基础体验。
> **提示**:入门学习可使用 Quick Start 镜像,生产部署请务必参考 [官方分布式部署指南](https://www.apolloconfig.com/#/zh/deployment/distributed-deployment-guide)。
## 项目管理与配置操作
### 创建第一个项目
登录 Portal,点击“创建项目”,填入:
- **应用ID**:全局唯一标识,对应客户端配置中的 `app.id`。
- **应用名称**:任意可读名称。
- **部门**:按需选择。
一个项目代表一个微服务或应用。创建后,项目下默认会存在 `DEV`、`TEST`、`FPP`(预生产)、`PRO` 等环境,每个环境可拥有独立的配置。
### 新增配置项
进入项目 → 选择环境(如 DEV)→ 点击“新增配置”。配置支持多种格式:
- **文本**:普通键值对,如 `timeout=3000`
- **JSON**:直接输入合法 JSON,前端会自动解析展示
- **XML / Properties / YAML**:选择对应格式输入即可
**示例**:添加一个 `server.port` 配置,值为 `8081`,并添加备注。完成后点击“发布”,配置才会推送到客户端。未发布的配置仅存储为草稿。
### 配置的命名空间
Apollo 引入了 `Namespace` 的概念来划分不同类别的配置。每个项目有两个默认命名空间:
- **application**:公共应用配置,客户端必加载。
- **TEXT** 或自定义的私有命名空间:可按模块划分,如 `datasource`、`redis`,客户端按需加载。
公共命名空间可被多个项目继承,实现配置共享。在“管理”界面可新增公共命名空间,然后其他项目引用。
### 灰度发布与版本回滚
灰度发布允许配置只对部分实例生效,用于验证配置可靠性。
操作路径:配置发布 → 点击“灰度” → 选择灰度规则(按 IP、按标签等),指定灰度实例 → 发布。灰度发布后,只有匹配规则的客户端收到新配置,其余仍用旧值。验证无问题后,可“全量发布”将配置推送给所有实例。
每次发布都会生成历史版本,可在“历史版本”中查看 diff 并一键回滚到任意历史版本。
## 客户端接入(以 Spring Boot 为例)
Apollo 客户端不限制语言,官方提供 Java、.Net、Go 等 SDK。以下演示 Java 项目接入步骤。
### 1. 添加依赖
在 Spring Boot 项目的 `pom.xml` 中加入:
```xml
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>2.1.0</version>
</dependency>
2. 基础配置
在 application.properties 或 bootstrap.properties 中设置 Apollo 必要参数:
# 必须,与 Portal 中创建的应用ID一致
app.id=my-demo-app
# Apollo Meta Server 地址(即 Config Service 地址)
apollo.meta=http://localhost:8080
# 可选,本地缓存路径
apollo.cacheDir=/opt/data/apollo-demo
# 可选,指定使用的环境
env=DEV
# 可选,指定集群名称(默认 default)
apollo.cluster=default
如果使用 Spring Cloud,可以引入 apollo-client-spring-boot-starter 并通过 application.yml 配置,但 app.id 等核心参数仍需提供。
3. 配置读取示例
方式一:通过 @Value 注解(支持动态刷新)
在 Spring Bean 中使用 @Value 并配合 @RefreshScope:
@RestController
@RefreshScope
public class ConfigController {
@Value("${timeout:3000}")
private int timeout;
@GetMapping("/timeout")
public int getTimeout() {
return timeout;
}
}
当 Apollo 中的 timeout 配置变更并发布后,带有 @RefreshScope 的 Bean 会重新注入新值。
方式二:通过 API 直接获取(非 Spring 环境)
Config config = ConfigService.getAppConfig(); // 获取 application 命名空间
String someKey = config.getProperty("someKey", "defaultValue");
Apollo 客户端 SDK 会在内存中维护配置缓存,并开启长轮询监听服务端变更,保证实时性(默认 1 秒间隔)。
4. 监听配置变更
如果需要执行自定义逻辑,可以实现监听器:
Config config = ConfigService.getAppConfig();
config.addChangeListener(changeEvent -> {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println("配置变更: " + key + " = " + change.getNewValue());
}
});