目录
一、apollo简介
二、apollo架构组成
三、apollo的通信
1、portal与admin的通信
2、admin与config的通信
3、config与client通信
四、灰度发布
五、使用中遇到的问题
一、apollo简介
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
apollo支持4个维度管理:1、application(应用);2、environment (环境);3、cluster (集群);4、namespace (命名空间)
(以上简介来源于apollo的wiki官方文档)
二、apollo架构组成
1、admin模块:
该模块负责对真正配置内容在数据库中的增删改查等操作,基于数据库ApolloConfigDB;
2、config模块:
该模块用于和调用客户端进行通信,用于接收admin配置的修改,推送客户端配置发生变更,客户端拉取最新配置内容,基于数据库ApolloConfigDB;
3、portal模块
该模块相当于是配置系统的前端UI界面,并且进行相关的权限管理,在portal模块进行配置内容的增删查改前端操作,最终调用admin模块保存到数据库中,基于数据库ApolloConfigDB;
4、client模块
该模块集成在需要调用apollo配置中心的相关服务中,用于通过config模块获取配置内容。
(该图来源于apollo官方wiki文档)
上图为apollo的整体架构图,apollo是采用springboot进行的开发,admin模块和config模块注册在eureka中。
client模块在获取配置信息的时候,先通过负载均衡访问meta server,然后通过eureka找到可用的config server来获取相关配置。这里有一个比较有意思的细节,为什么要有一层meta server,而不是直接访问config server?如果没有meta server这一层服务,那么该配置中心只能应用于java服务,添加上meta server这一层服务以后,就有了更好的扩展性,可以兼容更多语言,由meta server去进行兼容处理。
portal模块本身进行apollo项目的一个权限管理,有一个自己的独立数据库,然后当对具体的配置进行操作的时候,需要通过负载均衡,调用meta server服务,然后通过eureka找到可用的admin server,进行配置内容的管理。
config server,erueka,meta server在同一个jvm中。
(这里还有一个小细节就是,之所以采用eureka作为注册与发现中心,原因为:1、apollo本身就是使用spring boot进行的开发,具备天然的适配性;2、减少对其它中间件的依赖,让系统更加的简单)
三、apollo的通信
1、portal与admin的通信
这个通信就很简单,只是一个简单的服务调用,在portal模块进行配置的增删查改的时候,通过主动的api调用即可完成;
2、admin与config的通信
config是用来通知客户端配置发生变更,然后客户端拉取配置的模块,那么config是如何知道配置发生变更的呢?其实是利用mysql实现了一个简单的消息队列来实现的。当配置发生变更以后,admin模块会主动往数据库中的ReleaseMessage表中插入一条数据,该数据就是消息内容AppId+Cluster+Namespace,admin相当于的消息生产者;每个config模块会单开一个线程每秒一次的扫描ReleaseMessage表,如果发现有数据新增,就证明有配置变更,此时config就知道了有配置发生变更,然后根据AppId+Cluster+Namespace告知对应的客户端,config就相当于是消费者。
(在此通信中之所以没有采用一个真的消息中间件,而是采用mysql模拟的方式,也是为了降低系统的复杂性)
3、config与client通信
接下来就是最重要的client如何获取到配置内容,包含两种种情况:
1)client与config保持一个http的长链接,如果60s内没有响应,则返回状态码304,然后重新建立长链接,如果在长链接期间,config监听到了配置信息变更,则将有变化的namespace信息返回给client端,然后client端会主动调用config模块获取最新配置信息,通过上述方式实现了热更新;
2)为了防止config的推送失效,client端也会每五分钟主动访问一次config,获取最新的配置信息。
client端获取到配置信息以后,会将该信息放入内存中,并且会同时在本地缓存一份配置信息,防止apollo服务不可用的时候,读取不到配置信息。windows系统会缓存在c盘下的opt/data/namespace/configcache下;linux系统会缓存在/opt/目录下。
四、灰度发布
apollo的灰度发布指的是发布的配置信息对一部分服务器生效,对一部分服务器不生效,他是通过ip地址来进行的限制。
五、使用中遇到的问题
1、namespace不要使用0XXX这种方式进行命名,因为在yml配置文件中,对于数字会自动去0;
2、在搭建部署的时候,注意启动顺序,首先启动client端,因为eureka与client端是在同一个服务中,在刚开始启动的时候会报错,原因可能是eureka还没启动起来,config服务无法注册,等eureka服务启动成功以后,就好了;然后启动admin,最后启动portal。