Apollo配置中心架构设计原理

一、基础模型

1.用户在配置中心对配置进行修改并发布
2.配置中心通知Apollo客户端有配置更新
3.Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
在这里插入图片描述
二、架构模块

1、Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
2、Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
3、Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
4、在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发现接口
5、Client:Apollo提供的客户端程序,为应用提供配置获取、实时更新等功能,通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试
6、Portal提供Web界面供用户管理配置,通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
7、为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中

8、Meta Server
Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
增设一个Meta Server的角色主要是为了封装服务发现的细节,对Portal和Client而言,永远通过一个Http接口获取Admin Service和Config Service的服务信息,而不需要关心背后实际的服务注册和发现组件
Meta Server只是一个逻辑角色,在部署时和Config Service是在一个JVM进程中的,所以IP、端口和Config Service一致
在这里插入图片描述
三、选择Eureka的原因

1、提供了完整的Service Registry和Service Discovery实现
2、和Spring Cloud无缝集成
1)项目本身就使用了Spring Cloud和Spring Boot,同时Spring Cloud还有一套非 常完善的开源代码来整合Eureka,所以使用起来非常方便
2)Eureka还支持在我们应用自身的容器中启动,也就是说我们的应用启动完之 后,既充当了Eureka的角色,同时也是服务的提供者。这样就极大的提高了服务的可用性
3)为了提高配置中心的可用性和降低部署复杂度,我们需要尽可能地减少外部依赖
3、开源,由于代码是开源的,所以非常便于我们了解它的实现原理和排查问题。

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

1、用户在Portal操作配置发布
2、Portal调用Admin Service的接口操作发布
3、Admin Service发布配置后,发送ReleaseMessage给各个Config Service
4、Config Service收到ReleaseMessage后,通知对应的客户端
在这里插入图片描述
五、发送ReleaseMesssage的实现方式

1、Admin Service在配置发布后,需要通知所有的Config Service有配置发布,从而Config Service可以通知对应的客户端来拉取最新的配置
2、Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录,消息内容就是配置发布的AppId+Cluster+Namespace
3、Config Service有一个线程会每秒扫描一次ReleaseMessage表,看看是否有新的消息记录
4、Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器
4、NotificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端
在这里插入图片描述
六、ConfigService通知客户端的实现方式

1、客户端会发起一个Http请求到Config Service的notifications/v2接口,也就是NotificationControllerV2
2、NotificationControllerV2不会立即返回结果,而是通过Spring DeferredResult把请求挂起
3、如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端
4、如果有该客户端关心的配置发布,NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回。客户端从返回的结果中获取到配置变化的namespace后,会立即请求Config Service获取该namespace的最新配置
七、客户端设计

1、客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)
2、客户端还会定时从Apollo配置中心服务端拉取应用的最新配置
1)这是一个fallback机制,为了防止推送机制失效导致配置不更新
2)客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
3)定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟
3、客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
4、客户端会把从服务端获取到的配置在本地文件系统缓存一份(在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置)
5、应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值