启动 Apollo 需先初始化 MySQL 并配置两个服务的数据库连接,按 configservice→adminservice→portal 顺序启动;客户端需正确设置 -Denv=DEV、app.id 和 apollo.meta 指向 Config Service 地址。

怎么启动本地 Apollo Config Service 和 Admin Service
本地跑不起来 Apollo,八成卡在服务没真正启动成功。Apollo 的 Config Service 和 Admin Service 是两个独立的 Spring Boot 应用,不能只解压完就直接 java -jar —— 缺少数据库初始化和配置文件指向。
实操建议:
- 先用官方 SQL 脚本初始化 MySQL(
scripts/sql/apolloportaldb.sql和scripts/sql/apolloconfigdb.sql),注意两个库名要和后续配置里的一致 - 修改
apollo-configservice/src/main/resources/application-github.properties,确认spring.datasource.url指向你本地的apolloconfigdb - 同理改
apollo-adminservice的application-github.properties,让它连同一个apolloconfigdb(不是 portal 库) - 启动顺序必须是:先起
apollo-configservice,再起apollo-adminservice,最后才是apollo-portal;否则 Portal 会报Cannot connect to config service
为什么 apollo-client 找不到 namespace 或配置为空
不是 Apollo 服务没开,而是客户端根本没连上正确的环境或 namespace。Java 客户端默认走 dev 环境 + application namespace,但本地开发时容易漏掉两件事:环境标识、AppId 配置。
常见错误现象:
立即学习“Java免费学习笔记(深入)”;
- 日志里反复打印
Could not locate property sources或no configurations - 调用
ConfigService.getAppConfig().getProperty("xxx", null)返回null,但 Portal 页面明明有值
实操建议:
- 确保 JVM 启动参数加了
-Denv=DEV(大小写敏感!Apollo 不识别dev小写) -
app.properties必须放在classpath:/META-INF/app.properties,且内容只有app.id=your-app-id(不能有多余空格或 BOM) - 检查
application.yml里是否误配了apollo.meta=http://localhost:8080—— 这是 Portal 地址,客户端该连的是 Config Service(默认http://localhost:8080是错的,应为http://localhost:8080对应 Config Service 的实际端口,比如http://localhost:8080通常不对,正确是http://localhost:8081)
Spring Boot 项目集成 apollo-client 的最小依赖和配置
不用引入全量 apollo-spring-boot-starter,尤其在老 Spring Boot 2.3+ 或 JDK 17 下,starter 里某些反射逻辑会触发 IllegalAccessError。最稳的方式是手动拉核心依赖 + 显式初始化。
实操建议:
- Maven 只加这两个依赖:
com.ctrip.framework.apollo:apollo-client:2.1.0和com.ctrip.framework.apollo:apollo-core:2.1.0(版本必须一致) - 去掉
@EnableApolloConfig注解,改用编程式初始化:Config config = ConfigService.getAppConfig(); config.addChangeListener(new ConfigChangeListener() { ... }); - 如果要用
@Value注入,必须搭配ApolloInjector手动注册 Bean,否则 Spring 容器感知不到 Apollo 的 PropertySource - 避免在
@PostConstruct里读配置 —— 此时 Apollo 还没 ready,建议监听CONFIG_CHANGED事件后再加载业务逻辑
多环境部署时 apollo.meta 怎么设才不串
一个常见翻车点:测试环境和预发环境共用同一套 Apollo Config Service,但不同环境的应用读到了彼此的配置。根本原因是 apollo.meta 配置错了,或者被系统变量覆盖了。
实操建议:
-
apollo.meta必须指向对应环境的 Config Service 地址,例如:-Dapollo.meta=http://config-dev.xxx.com(不是 Portal 地址,也不是 IP) - 禁止在代码里硬编码
System.setProperty("apollo.meta", "...")—— 容器里多个应用会互相污染 - K8s 场景下,用
env:注入APOLLO_META,而不是靠配置中心传值;因为 Apollo 自身启动早于其他配置加载 - 验证方式:启动后查日志,搜索
Located meta server address,看输出的 URL 是否符合预期
环境变量、JVM 参数、配置文件三者对 apollo.meta 的优先级是:JVM 参数 > 系统环境变量 > 配置文件。最容易忽略的是 CI/CD 脚本里偷偷写了 -Dapollo.meta=xxx,结果覆盖了你本地的设置。











