3. Apollo环境搭建:Docker Compose部署Apollo、数据库初始化、Portal与Config Service配置
好,咱们直接进入实战环节。这一章我会带你亲手把Apollo跑起来。说实话,配置中心这东西,光看文档不实操,永远学不会。我见过太多人卡在环境搭建这一步,其实没那么复杂。
3.1 为什么选Docker Compose?
你可能会问:为啥非要用Docker Compose?直接下载个安装包不香吗?
嗯,这里有个坑。Apollo依赖Eureka做服务发现,还依赖MySQL存配置数据。手动装的话,你得先装MySQL、建库、初始化表结构,再启动Config Service、Admin Service、Portal三个服务。光配置文件的修改就能让你折腾半天。
我个人习惯用Docker Compose,原因很简单:一条命令拉起所有服务。而且环境隔离,不会污染你的开发机。我在项目中遇到过好几次,因为本地装了不同版本的MySQL导致Apollo启动失败,用Docker就再没出过这种问题。
核心组件一览:
- Config Service — 配置读取入口,客户端连的就是它
- Admin Service — 配置管理入口,Portal后台调的就是它
- Portal — 可视化配置管理界面
- Eureka — 服务注册与发现,Apollo内部用
- MySQL — 持久化配置数据
3.2 准备工作:目录结构与配置文件
先创建项目目录。我习惯把Apollo相关的文件都放在一个文件夹里,方便管理。
mkdir apollo-docker-compose
cd apollo-docker-compose
然后创建 docker-compose.yml。这是核心文件,定义了所有服务的启动参数。直接上代码:
version: '3.8'
services:
apollo-db:
image: mysql:5.7
container_name: apollo-db
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: ApolloConfigDB
ports:
- "3306:3306"
volumes:
- ./sql:/docker-entrypoint-initdb.d
- apollo-db-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
apollo-configservice:
image: apolloconfig/apollo-configservice:2.1.0
container_name: apollo-configservice
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://apollo-db:3306/ApolloConfigDB?useSSL=false
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root123
EUREKA_INSTANCE_IP: apollo-configservice
depends_on:
apollo-db:
condition: service_healthy
apollo-adminservice:
image: apolloconfig/apollo-adminservice:2.1.0
container_name: apollo-adminservice
ports:
- "8090:8090"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://apollo-db:3306/ApolloConfigDB?useSSL=false
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root123
depends_on:
apollo-db:
condition: service_healthy
apollo-portal:
image: apolloconfig/apollo-portal:2.1.0
container_name: apollo-portal
ports:
- "8070:8070"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://apollo-db:3306/ApolloPortalDB?useSSL=false
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root123
APOLLO_PORTAL_ENVS: dev
DEV_META: http://apollo-configservice:8080
depends_on:
apollo-db:
condition: service_healthy
volumes:
apollo-db-data:
小提示:这里我用了MySQL 5.7,因为Apollo对MySQL 8.x的兼容性在早期版本有点小问题。如果你非要用8.x,记得加 ?useSSL=false&allowPublicKeyRetrieval=true 参数。
3.3 数据库初始化:别小看这一步
Apollo需要两个数据库:ApolloConfigDB 和 ApolloPortalDB。前者存配置数据,后者存Portal的用户、权限等信息。
官方提供了初始化SQL脚本。你需要下载它们放到 ./sql 目录下:
mkdir sql
cd sql
wget https://github.com/apolloconfig/apollo/raw/master/scripts/db/migration/configdb/V1.0.0__initialization.sql
wget https://github.com/apolloconfig/apollo/raw/master/scripts/db/migration/portaldb/V1.0.0__initialization.sql
注意文件名。Docker启动时,MySQL容器会自动执行 /docker-entrypoint-initdb.d 目录下的所有SQL文件。但有个细节:文件是按字母顺序执行的。所以如果你有多个SQL文件,记得命名好顺序。
我曾经踩过的坑:有一次我直接把两个SQL文件丢进去,结果ApolloConfigDB还没初始化完,Portal就去连了,导致启动失败。后来我改成在docker-compose里加 healthcheck,等数据库完全就绪再启动其他服务。上面代码里已经加上了,你直接用就行。
3.4 启动服务:见证奇迹的时刻
一切准备就绪,执行启动命令:
docker-compose up -d
第一次启动会拉取镜像,大概需要几分钟。你可以用 docker-compose logs -f 查看实时日志。
看到类似下面的日志,说明启动成功了:
apollo-configservice | Started ApolloConfigServiceApplication in 25.3 seconds
apollo-adminservice | Started ApolloAdminServiceApplication in 18.7 seconds
apollo-portal | Started ApolloPortalApplication in 22.1 seconds
验证一下服务是否正常:
| 服务 | 地址 | 验证方法 |
|---|---|---|
| Eureka | http://localhost:8080/eureka | 浏览器打开,看到注册的服务列表 |
| Config Service | http://localhost:8080 | 返回JSON格式的健康检查信息 |
| Admin Service | http://localhost:8090 | 返回JSON格式的健康检查信息 |
| Portal | http://localhost:8070 | 浏览器打开,看到登录页面 |
Portal的默认账号密码是 apollo / admin。登录后你会看到一个清爽的管理界面。
3.5 配置Portal与Config Service的关联
这里有个关键点:Portal需要知道Config Service的地址,才能拉取配置列表。在docker-compose里,我们通过环境变量 APOLLO_PORTAL_ENVS 和 DEV_META 来配置。
说白了,就是告诉Portal:「嘿,开发环境的Config Service在 http://apollo-configservice:8080 这个地址」。如果你有多个环境(比如dev、test、prod),可以这样配:
APOLLO_PORTAL_ENVS: dev,test,prod
DEV_META: http://apollo-configservice:8080
TEST_META: http://test-configservice:8080
PROD_META: http://prod-configservice:8080
注意,这里的 apollo-configservice 是Docker容器内的服务名,不是IP。Docker Compose会自动做DNS解析,容器之间用服务名通信就行。
核心要点:
- Config Service和Admin Service共用
ApolloConfigDB - Portal单独使用
ApolloPortalDB - Portal通过
DEV_META等环境变量找到Config Service - Config Service内置了Eureka,不需要额外部署注册中心
3.6 验证整体链路
启动完成后,我建议你做一次完整的链路验证:
- 打开 Eureka控制台 (http://localhost:8080/eureka),确认
CONFIG-SERVICE和ADMIN-SERVICE都已注册 - 打开 Portal (http://localhost:8070),用
apollo/admin登录 - 创建一个测试项目,比如叫
demo-app - 添加一个配置项,比如
timeout=5000 - 发布配置
- 通过API验证配置是否生效:
curl http://localhost:8080/configs/demo-app/default/application
如果第6步能返回你刚设置的配置,恭喜你,环境搭建成功了!
一个小技巧:我习惯在Portal里先创建一个 application 命名空间(Namespace),然后把公共配置放进去。这样所有客户端都能继承这些配置,不用每个应用都重复配一遍。后面章节会详细讲Namespace的设计。
嗯,环境搭建就到这里。你可能会觉得步骤有点多,但说白了就是「配好数据库 → 启动容器 → 验证链路」这三步。第一次搭可能花半小时,熟练了五分钟搞定。