Apollo架构

架构模块

官方文档:

https://www.apolloconfig.com/#/zh/design/apollo-design

架设一个apollo需要部署的服务

apollo-configservice, apollo-adminservice, apollo-portal, eureka。

组件介绍

Config Service: 提供配置的读取、推送等功能,服务对象是Apollo客户端。
Admin Service: 提供配置的修改,发布等功能,服务对象是portal。
Client: Apollo客户端
portal: 管理界面
Eureka: 注册中心,服务注册和发现。
Meta Server: 用于封装Eureka的服务发现接口,**为啥有了eureka还要有这个呢?**为了兼容多种开发语言而设计的。Client通过域名访问Meta server获取Config Service服务列表(ip+port),然后通过ip+port访问Config Service,从中读取配置信息。
(Software) Load Balancer:软负载均衡。

Apollo支持热更新原理

原理图

原理图
流程:
1,用户在配置中心对配置进行修改并发布
2,配置中心通知Apollo客户端有配置更新
3,Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

原理:(推拉结合)
客户端和服务器保持了一个长连接,服务器有修改就会推送给客户端,为了防止推送机制不生效,所以有了客户端定时拉取配置的兜底机制(采用推拉结合的模式,client的定时轮询,可以保持最终一致;client的长轮询是定时轮询的实时补充。)。客户端从配置中心服务端获取到的配置会保存在内存中,且会保存一份本地文件,为了防止由于网络原因,应用启动的时候,导致拉取不到配置中心的配置而产生错误,应用程序从apollo客户端获取最新的配置和订阅配置更新通知。

配置发布大致过程

配置发布大致过程

顺序:

1,用户在Portal操作配置发布
2,Portal调用Admin Service的接口操作发布
3,Admin Service发布配置后,发送ReleaseMessage给各个Config Service
4,Config Service收到ReleaseMessage后,通知对应的客户端。

发送ReleaseMessage的实现方法

Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录,消息内容就是配置发布的AppId+Cluster+Namespace,参见DatabaseMessageSender
Config Service有一个线程会每秒扫描一次ReleaseMessage表,看看是否有新的消息记录,参见ReleaseMessageScanner
Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器(ReleaseMessageListener),如NotificationControllerV2,消息监听器的注册过程参见ConfigServiceAutoConfiguration
NotificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端

Apollo和spring集成

概念

spring 中包含了一个ConfigurableEnvironment配置环境(env=dev,test),。结构如下图 : ProoertySource表示属性源,也即是很多个Key - Value的属性配置,namespace:管理界面上的namespace,一个namespace对应一个属性源。PropertySources是属性源的集合,是LinkedHashSet类型,底层是链表和hash表,所以它是由顺序的,读取配置的时候首先读取最前面的,所以如果有一个Key在多个property source中都存在,那么在前面的property source优先。
在应用启动阶段,Apollo从远端获取配置,然后组装成PropertySource并插入到第一个即可。
在这里插入图片描述

源码详解

领域上下文

LocalFileConfigRepository:本地文件配置仓库,作用:项目启动的时候,由于网络原因,导致不能拉取到远程配置,就会从本地配置文件拉取配置。主要应用于没有网络的环境,比如:潜艇,航空,邮轮。本地配置文件是不能即时更新的,需要重启应用。
RemoteConfigRepository:远程配置仓库,定时轮询ConfigService,读取最新的配置,并缓存在内存中。定时 + 实时刷新缓存。
RemoteConfigLongPollService:长轮询ConfigService的配置更新通知接口,有更新的话,立刻通过ConfigService读取最新配置。
namespace:portal中创建的:如下图所示:
namespace
说明:
①,一个namespace对应一个RemoteConfigRepository,每个RemoteConfigRepository对应一个Config。
②,多个RemoteConfigRepository注册到全局唯一的RemoteConfigLongPollService中。

spring集成源码

1,ApolloApplicationContextInitializer(Apollo容器初始化类)类中的initialize方法,对apollo容器启动进行初始化工作。
在这里插入图片描述
获取namespace,获取每个namespace的配置,封装成PropertySource,然后放进environment(PropertySources)中。
在这里插入图片描述
2,ConfigService.getConfig(namespace)方法:
com.ctrip.framework.apollo.internals.DefaultConfigManager#getConfig(String namespace).
在这里插入图片描述
3,具体的工厂类创建Config:com.ctrip.framework.apollo.spi.DefaultConfigFactory#create(String namespace).
在这里插入图片描述
创建Config首先需要创建LocalConfigRepository:
com.ctrip.framework.apollo.spi.DefaultConfigFactory#createLocalConfigRepository(String namespace)
在这里插入图片描述

4,创建远程配置仓库:com.ctrip.framework.apollo.internals.RemoteConfigRepository#RemoteConfigRepository(String namespace)
在这里插入图片描述

同步方法:com.ctrip.framework.apollo.internals.RemoteConfigRepository#sync
在这里插入图片描述
从远程获取配置:com.ctrip.framework.apollo.internals.RemoteConfigRepository#loadApolloConfig
通过HTTP接口获取在这里插入图片描述

5,创建完远程仓库之后,回到第3步,创建本地配置仓库。
com.ctrip.framework.apollo.internals.LocalFileConfigRepository#LocalFileConfigRepository(java.lang.String, com.ctrip.framework.apollo.internals.ConfigRepository)
在这里插入图片描述
本地配置文件同步方法:com.ctrip.framework.apollo.internals.LocalFileConfigRepository#sync
在这里插入图片描述
从上游同步:com.ctrip.framework.apollo.internals.LocalFileConfigRepository#trySyncFromUpstream
在这里插入图片描述
com.ctrip.framework.apollo.internals.LocalFileConfigRepository#updateFileProperties
在这里插入图片描述

结束,创作不易,点赞关注

Logo

为开发者提供自动驾驶技术分享交流、实践成长、工具资源等,帮助开发者快速掌握自动驾驶技术。

更多推荐