2. 环境搭建:Apollo服务端部署(Docker方式)、Apollo客户端集成(Spring Boot)、Apollo Portal控制台初探
这一章,咱们直接动手。环境搭好了,后面所有的配置管理才有落脚点。我个人习惯用 Docker 来部署服务端,因为快、干净、不污染宿主机。客户端集成呢,我选 Spring Boot,这是目前 Java 生态里最主流的框架。最后,咱们进 Portal 控制台溜达一圈,看看 Apollo 长什么样。
2.1 Apollo 服务端部署(Docker 方式)
Apollo 的服务端分三个组件:Config Service、Admin Service 和 Portal。Config Service 负责给客户端提供配置,Admin Service 负责管理配置,Portal 就是咱们的 Web 控制台。
官方提供了 Docker 镜像,省去了手动配置 MySQL 和 Eureka 的麻烦。我在项目中遇到过直接用脚本部署的情况,说实话,还是 Docker Compose 最省心。
2.1.1 准备工作:MySQL 数据库
Apollo 需要两个数据库:ApolloPortalDB 和 ApolloConfigDB。别担心,官方提供了初始化脚本。
# 下载官方初始化脚本
wget https://github.com/apolloconfig/apollo-build-scripts/raw/master/sql/apolloportaldb.sql
wget https://github.com/apolloconfig/apollo-build-scripts/raw/master/sql/apolloconfigdb.sql
# 登录 MySQL 执行
mysql -u root -p < apolloportaldb.sql
mysql -u root -p < apolloconfigdb.sql
执行完后,检查一下数据库是否创建成功:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| ApolloPortalDB |
| ApolloConfigDB |
+--------------------+
utf8mb4。
2.1.2 Docker Compose 一键部署
我个人习惯用 Docker Compose 来编排多容器应用。下面这个 docker-compose.yml 是我在实际项目中用过的,稍微简化了一下:
version: '3.8'
services:
apollo-configservice:
image: apolloconfig/apollo-configservice:2.1.0
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://你的MySQL地址:3306/ApolloConfigDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=你的密码
depends_on:
- mysql
apollo-adminservice:
image: apolloconfig/apollo-adminservice:2.1.0
ports:
- "8090:8090"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://你的MySQL地址:3306/ApolloConfigDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=你的密码
depends_on:
- mysql
apollo-portal:
image: apolloconfig/apollo-portal:2.1.0
ports:
- "8070:8070"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://你的MySQL地址:3306/ApolloPortalDB?characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=你的密码
- APOLLO_PORTAL_ENVS=dev
- DEV_META=http://apollo-configservice:8080
depends_on:
- mysql
执行启动命令:
docker-compose up -d
等个一两分钟,检查一下容器状态:
docker-compose ps
三个容器都 Up 了,说明部署成功。访问 http://localhost:8070 就能看到 Portal 登录页。默认账号密码是 apollo / admin。
localhost,要写宿主机的 IP(比如 192.168.x.x),因为容器里的 localhost 指向的是容器自己。
2.2 Apollo 客户端集成(Spring Boot)
服务端跑起来了,接下来咱们让 Spring Boot 应用连上 Apollo。说白了,就是把 Spring Boot 的配置文件交给 Apollo 管理。
2.2.1 添加依赖
在 pom.xml 里引入 Apollo 客户端:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>2.1.0</version>
</dependency>
2.2.2 配置 Apollo
在 application.properties 或 application.yml 里指定 Apollo 的元数据地址:
# application.properties
app.id=my-spring-boot-app
apollo.meta=http://localhost:8080
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application
这里解释一下:
app.id:你的应用在 Apollo 上的唯一标识apollo.meta:Config Service 的地址apollo.bootstrap.enabled:开启 Apollo 的启动加载apollo.bootstrap.namespaces:指定要加载的命名空间,默认是application
2.2.3 使用配置
在代码里,你可以像使用本地配置一样使用 Apollo 的配置:
@Component
public class SampleBean {
@Value("${server.port:8080}")
private int port;
@Value("${my.config.key:default-value}")
private String myConfig;
public void printConfig() {
System.out.println("当前端口: " + port);
System.out.println("自定义配置: " + myConfig);
}
}
你想想看,以前改配置要重启应用,现在只要在 Portal 上改一下,客户端就能实时生效。嗯,这里要注意,实时生效需要配合 @ApolloConfigChangeListener 或者开启自动刷新。
apollo.bootstrap.enabled=true,结果配置死活加载不上。后来排查了半天才发现是这个问题。所以,这个配置一定要加上。
2.3 Apollo Portal 控制台初探
服务端部署好了,客户端也集成了,咱们进 Portal 看看。访问 http://localhost:8070,用 apollo / admin 登录。
2.3.1 创建项目
登录后,点击「创建项目」。输入 AppId 和 应用名,AppId 要和客户端配置的 app.id 一致。部门随便选一个就行。
创建成功后,你会看到项目的配置页面。默认有一个 application 命名空间,这就是客户端默认加载的那个。
2.3.2 添加配置项
点击「添加配置」,输入 Key 和 Value。比如:
| Key | Value |
|---|---|
| my.config.key | hello-apollo |
| server.port | 9090 |
点击「发布」按钮,配置就生效了。回到你的 Spring Boot 应用,调用 printConfig() 方法,你会看到输出变成了新的值。
2.3.3 命名空间与集群
Portal 里还有两个重要概念:命名空间和集群。
- 命名空间:相当于配置的分组。你可以为不同的模块创建不同的命名空间,比如
datasource、redis等。 - 集群:用于区分不同环境(开发、测试、生产)或不同机房。默认有一个
default集群。
说白了,命名空间是横向切分(按功能),集群是纵向切分(按环境)。
2.4 本章知识体系
下面这张图帮你梳理了本章的核心逻辑:
这张图展示了从服务端部署到客户端集成,再到 Portal 控制台操作的完整链路。你跟着这个流程走一遍,Apollo 的基本环境就搭好了。
嗯,环境搭好了,后面就可以深入玩配置管理了。我个人觉得,Apollo 最强大的地方不是配置存储,而是配置的变更管理和灰度发布能力。这些咱们后面慢慢聊。