Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
Apollo基于开源模式开发,开源地址:https://github.com/ctripcorp/apollo
1.1.1 用户在配置中心对配置进行修改并发布
1.1.2 配置中心通知Apollo客户端有配置更新
1.1.3 Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
1.2.1 Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
1.2.2 Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
1.2.3 Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
1.2.4 在Eureka之上架了一层Meta Server用于封装Eureka的服务发现接口
1.2.5 Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试
1.2.6 Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中
2.1.1 用户在Portal操作配置发布
2.1.2 Portal调用Admin Service的接口操作发布
2.1.3 Admin Service发布配置后,发送ReleaseMessage给各个Config Service
2.1.4 Config Service收到ReleaseMessage后,通知对应的客户端
2.2.1 Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录,消息内容就是配置发布的AppId+Cluster+Namespace,参见DatabaseMessageSender
2.2.2 Config Service有一个线程会每秒扫描一次ReleaseMessage表,看看是否有新的消息记录,参见ReleaseMessageScanner
2.2.3 Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器(ReleaseMessageListener),如NotificationControllerV2,消息监听器的注册过程参见ConfigServiceAutoConfiguration
2.2.4 NotificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端
3.1 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)
3.2 定时拉取服务端配置信息,并缓存到本地,在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
4.1.1 jdk准备,apollo服务端springboot服务需要jdk1.8+,apollo客户端jdk1.7+
4.1.2 mysql准备,版本要求:5.6.5+
Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。
连接上MySQL后,可以通过如下命令检查:SHOW VARIABLES WHERE Variable_name = 'version';
Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
4.2.1 创建ApolloPortalDB, 通过各种MySQL客户端导入apolloportaldb.sql即可
4.2.2 创建ApolloConfigDB,通过各种MySQL客户端导入apolloconfigdb.sql即可
4.3.1 直接下载安装包, 从GitHub Release页面下载预先打好的安装包
4.3.2 通过源码构建,从GitHub Release页面下载Source code包或直接clone源码后在本地构建
下载完源码,编辑scripts/build.sh,修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息和meta server信息
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://127.0.0.1:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=123456
# meta server url, different environments should have different meta server addresses
dev_meta=http://127.0.0.1:7081
fat_meta=http://127.0.0.1:7082
uat_meta=http://127.0.0.1:7083
pro_meta=http://127.0.0.1:7084
注1:由于ApolloConfigDB在每个环境都有部署,所以对不同的环境config-service和admin-service需要使用不同的数据库参数打不同的包,portal只需要打一次包即可
注2:由于config-service和eureka和meta server是在一起的,所有config-service,meta server和数据库ApolloConfigDB的serverconfig表中配置的eureka.service.url服务地址要保持一致。不然无法注册到注册中心
4.4.1 获取apollo-configservice安装包
位于apollo-configservice/target/目录下的apollo-configservice-x.x.x-github.zip
需要注意的是由于ApolloConfigDB在每个环境都有部署,所以对不同环境的config-service需要使用不同的数据库参数打不同的包后分别部署
4.4.2 获取apollo-adminservice安装包
位于apollo-adminservice/target/目录下的apollo-adminservice-x.x.x-github.zip
需要注意的是由于ApolloConfigDB在每个环境都有部署,所以对不同环境的admin-service需要使用不同的数据库参数打不同的包后分别部署
4.4.3 获取apollo-portal安装包
位于apollo-portal/target/目录下的apollo-portal-x.x.x-github.zip
依次部署apollo-configservice,apollo-adminservice,部署apollo-portal
将对应的zip包上传到服务器上,解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.
注1:如要调整服务的监听端口,可以修改scripts/startup.sh中的SERVER_PORT
。另外apollo-configservice同时承担meta server职责,如果要修改端口,注意要同时ApolloConfigDB.ServerConfig表中的eureka.service.url
配置项以及apollo-portal和apollo-client中的使用到的meta server信息
注2:portal默认登录密码是apollo/admin
可参考ctrip部署策略
参考官方文档
1. apollo
2.Apollo配置中心设计
3.分布式部署指南