📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文导读
一、Apollo配置发布原理
二、Apollo 发送 ReleaseMessage 原理
三、Apollo Config Service 通知客户端原理
四、Apollo Client 客户端读取设计
总结
本文导读
本文主要讲解Apollo配置发布原理,深入浅出通俗易懂的说明了Apollo配置发布过程中的,发送 ReleaseMessage 原理、Config Service 通知客户端原理、Client 客户端读取设计原理。
一、Apollo配置发布原理
在配置中心中,一个重要的功能就是配置发布后实时推送到客户端,配置发布的主要过程:
1、用户在Portal操作配置发布
2、Portal调用Admin Service的接口操作发布
3、Admin Service发布配置后,发送 ReleaseMessage 给各个Config Service
4、Config Service 收到ReleaseMessage后,通知对应的客户端
二、Apollo 发送 ReleaseMessage 原理
Admin Service在配置发布后,需要通知所有的Config Service有配置发布,从而Config Service可以通知对应的客户端来拉取最新的配置。
Admin Service作为producer(生产者)发出消息,各个Config Service作为consumer(消费者)消费消息。通过一个消息队列组件(Message Queue)就能很好的实现Admin Service和Config Service的解耦。
在实现上Apollo为了尽可能减少外部依赖通过数据库实现了一个简单的消息队列。
1、Admin Service在配置发布后会往 ReleaseMessage表 插入一条消息记录,消息内容就是配置发布的 AppId+Cluster+Namespace
2. Config Service有一个线程会每秒扫描一次ReleaseMessage表,看看是否有新的消息记录
3. Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器,然后调用消息监听类的handleMessage方法(NotificationControllerV2)
4. NotificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端
三、Apollo Config Service 通知客户端原理
消息监听类在得知有配置发布后是如何通知到客户端的?客户端和服务端保持一个长连接,从而能第一时间获得配置更新的推送
1、客户端会发起一个Http请求到Config Service的 notifications/v2 接口(NotificationControllerV2)
2、NotificationControllerV2不会立即返回结果,而是把请求挂起。考虑到会有数万客户端向服务端发起长连,因此在服务端使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。
3、如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端。
4、如果有该客户端关心的配置发布,NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回。客户端从返回的结果中获取到配置变化的namespace 后,会立即请求Config Service获取该namespace的最新配置。
四、Apollo Client 客户端读取设计
客户端还会定时从 Apollo配置中心服务端拉取应用的最新配置。
这是一个备用机制,为了防止推送机制失效导致配置不更新,客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定 System Property(apollo.refreshInterval)来覆盖,单位为分钟。
apollo.refreshInterval=
总结
本文主要讲解Apollo配置发布原理,深入浅出通俗易懂的说明了Apollo配置发布过程中的,发送 ReleaseMessage 原理、Config Service 通知客户端原理、Client 客户端读取设计原理。