apollo配置中心搭建以及原理介绍

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。

Apollo基于开源模式开发,开源地址:https://github.com/ctripcorp/apollo

1. 1 基础模型

1.1.1 用户在配置中心对配置进行修改并发布

1.1.2 配置中心通知Apollo客户端有配置更新

1.1.3 Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

1.2 模块说明

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 服务端设计

2.1 配置发布后的实时推送设计

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 发送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 客户端设计

3.1 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)

3.2 定时拉取服务端配置信息,并缓存到本地,在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置

4. 服务搭建

4.1 环境准备

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';
 

4.2 创建数据库

Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
4.2.1 创建ApolloPortalDB, 通过各种MySQL客户端导入apolloportaldb.sql即可

4.2.2 创建ApolloConfigDB,通过各种MySQL客户端导入apolloconfigdb.sql即可

4.3 获取安装包

4.3.1 直接下载安装包, 从GitHub Release页面下载预先打好的安装包

4.3.2 通过源码构建,从GitHub Release页面下载Source code包或直接clone源码后在本地构建

4.4 通过源码构建服务

下载完源码,编辑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只需要打一次包即可

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

5. 服务部署

依次部署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信息

参考方法文档

1. apollo

2.Apollo配置中心设计

3.分布式部署指南

发布了8 篇原创文章 · 获赞 3 · 访问量 1016

猜你喜欢

转载自blog.csdn.net/jaemy2011/article/details/105026259