官方文档:https://github.com/ctripcorp/apollo/wiki
源码解析:http://www.iocoder.cn/categories/Apollo/
apollo 的官方文档已经很完善了,写这个博客的目的在于在官网文档的基础上加上一些经验分享
欢迎加群交流讨论:816478697
环境准备:
Java: 1.8+ 检查:java -version
MySql:5.6.5+ 检查:SHOW VARIABLES WHERE Variable_name = ‘version’;
apollo 模块介绍
Config Service 提供配置获取接口,提供配置更新推送接口,Eureka 与 Config Service 在同一项目中,接口服务对象为 Apollo 客户端
Admin Service 提供配置管理接口,提供配置修改、发布等接口,接口服务对象为 Portal
Portal 提供 Web 界面供用户管理配置
一、分布式部署
第一步 确定部署方案
1、部署几个环境
我的方案是部署 DEV(开发环境)、FAT(测试环境)、PRO(生产环境)三个环境,主要是根据公司项目的实际情况来选择。大部分公司这三个环境就已满足了,分工明细流程规范一点的公司会分的细一点,可能需要增加 UAT(回归测试)、其它自定义环境
2、服务器分配,哪个服务器部署什么环境
我使用的是官网的一个最常规的部署方式,如下图:
第二步 创建数据库
apollo 有两个数据库:
ApolloPortalDB 为 Portal 模块的数据库,只需要在有部署 Portal 的地方部署就可以,我只在 PRO 有,也就是只需要在生产环境部署一套
ApolloConfigDB 需要在每一个环境都部署一套,也就是需要针对 DEV、FAT、UAT 分别部署一套
执行 sql 在源码中有,部署完数据库后,我们先打包需要的部署包,后面再讲数据库的配置
第三步 打包 PRO 环境所需部署包,原因是生产环境部署了 Portal 有具体的后台管理界面
源码 git 地址:https://github.com/ctripcorp/apollo.git
因为 Eureka 在 Config Service 中,我们先设置 Config Service 的配置
下面主要是 eureka 的配置,需要注意的是假如服务器有多网卡,必须要指定一下注册地址
接下来配置 Admin Service
配置 portal
接着配置 core,不注意的话很可能会忽略掉这点,把不需要的环境注释掉,或者需要额外增加环境的话也需要在这个配置里面增加
apollo 支持的环境有 LOCAL, DEV, FWS, FAT, UAT, LPT, PRO, TOOLS,可看下面枚举
配置编译脚本,当前配置的都是 PRO(生产环境)
这个时候我们对每一个环境的启动端口,数据库配置等都有了一个认识,然后我们再来修改数据库的配置就很清晰了,这个步骤一定不能少,不然 portal 会找不到环境
执行 build.sh 打包,我用的是 git-bash 环境进行的编译
编译完成后我们需要 3 个部署文件
apollo-adminservice-0.11.0-SNAPSHOT-github.zip
apollo-configservice-0.11.0-SNAPSHOT-github.zip
apollo-portal-0.11.0-SNAPSHOT-github.zip
将 3 个 zip 文件丢到服务器 unzip 解压,得到部署文件
为了让 apollo 知道当前部署的是哪个环境,需要在系统里面添加一个配置文件,说明当前系统的环境
配置文件地址:/opt/settings/server.properties 或者 c:\opt\settings\server.properties
配置信息: env=PRO (设置成对应的环境)
执行启动脚本 startup.sh
linux 获取文件执行权限 chmod u+x *.sh
我们 adminservice 部署的是 9002 端口,浏览器打开http://ip:9002 显示如下图说明部署成功
再同样的方法启动 apollo-configservice 和 apollo-portal
启动 apollo-congfigservice 成功后浏览器打开http://ip: 端口,会看到两个服务已成功注册到 eureka
然后我们访问 apollo-portal 部署地址,就可以进入配置管理后台
初始账号 apollo,密码 admin
其它环境配置方式和部署方式一致,仅少了 apollo-portal 的部署步骤
到此 apollo 的三个环境就部署完成了,登陆后台可以看到三个环境的配置
项目集成(spring 项目集成):
首先在原有的项目中引入所需 jar 文件
核心 jar 为(编译后获得):
apollo-core-0.11.0.jar
apollo-client-0.11.0.jar
相关依赖如下:
//apollo 相关依赖 jar 包 gradle 版
compile group: ‘com.ctrip.framework.apollo’, name: ‘apollo-core’, version: ‘0.11.0’
compile group: ‘com.ctrip.framework.apollo’, name: ‘apollo-client’, version: ‘0.11.0’
compile ‘aopalliance:aopalliance:1.0’
compile ‘com.google.inject:guice:4.2.0’
compile ‘com.google.code.gson:gson:2.6.1’
compile ‘com.google.guava:guava:18.0’
compile ‘javax.inject:javax.inject:1’
compile ‘org.apache.logging.log4j:log4j-core:2.11.0’
compile ‘org.apache.logging.log4j:log4j-api:2.11.0’
compile ‘org.apache.logging.log4j:log4j-slf4j-impl:2.11.0’
//maven 版
com.ctrip.framework.apollo
apollo-client
0.11.0
com.ctrip.framework.apollo
apollo-core
0.11.0
com.google.inject
guice
4.1.0
com.google.code.gson
gson
2.8.0
2、在项目 resource 中添加 /META-INF/app.properties 文件,添加 app.id=${app.id}
3、创建文件 C:\opt\settings\server.properties,添加 env=DEV
4、集成
4.1 springboot 集成,在 application.properties 只配置下边内容
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application
4.2 spring 集成
5、正常启动并查看 C:\opt\data${app.id}\config-cache 下文件内容有配置即集成完成。
6、如果本地开发,可以在 3 步骤的 server.propoerties 中 env=DEV 改为 env=LOCAL, 这样就会使用 C:\opt\data${app.id}\config-cache 配置而不会在去服务器上拉取配置
经验分享:
1、在创建项目配置时需要充分理解 apollo 的 namespace 的设计理念,做好划分,充分的重用配置
namespace 分为以下几种:
初始化项目分配的 application:私有,只能被当前应用引用,在 spring 配置中引入 即可使用,一些比较独立的配置可放到这里
私有:只能被当前应用引用,一些比较独立的配置可放到这里
公有:所有项目都可以引用,一些都有的配置项放到这里,比如 jdbc,zookeeper,redis,mq 等的配置,这样可以极大的提高配置的重用,当改动时只需改动一个配置即可达到全部应用都改变
2、在项目中要充分利用好 LOCAL 的特性,当当前环境配置 /opt/settings/server.properties 成本地环境 LOCAL 时 apollo 不会去拉取远程的配置,而是读取本地的缓存配置文件。除了在本地开发时常用,这个特性还可以在当 apollo 的某个环境服务停掉时应急使用,可以将该环境暂时改为 LOCAL,这样不会影响到应用程序的正常运行,等服务恢复后再改回来。