Apollo服务端设计原理剖析

本文深入解析Apollo配置中心的实时推送设计,包括配置发布后的实时推送、使用Mysql实现的消息队列、Http长连接通知客户端的方式,以及源码层面的 DeferredResult 实现原理。通过对Apollo核心推送流程的分析,帮助读者理解其实时更新配置的机制。
摘要由CSDN通过智能技术生成

本文摘自于《Spring Cloud微服务 入门 实战与进阶》一书。

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

配置中心最重要的一个特性就是实时推送了,正因为有这个特性,我们可以依赖配置中心做很多事情。在我自己开发的Smconf这个配置中心,Smconf是依赖于Zookeeper的Watch机制来实现实时推送。

上图简要描述了配置发布的大致过程:

  • 用户在Portal中进行配置的编辑和发布

  • Portal会调用Admin Service提供的接口进行发布操作

  • Admin Service收到请求后,发送ReleaseMessage给各个Config Service,通知Config Service配置发生变化

  • Config Service收到ReleaseMessage后,通知对应的客户端,基于Http长连接实现

2 发送ReleaseMessage的实现方式

ReleaseMessage消息是通过Mysql实现了一个简单的消息队列。之所有没有采用消息中间件,是为了让Apollo在部署的时候尽量简单,尽可能减少外部依赖。

上图简要描述了发送ReleaseMessage的大致过程:

  • Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录

  • Config Service会启动一个线程定时扫描ReleaseMessage表,去查看是否有新的消息记录

  • Config Service发现有新的消息记录,那么就会通知到所有的消息监听器

  • 消息监听器得到配置发布的信息后,则会通知对应的客户端

3 Config Service通知客户端的实现方式

通知是采用基于Http长连接实现,主要分为下面几个步骤:

  • 客户端会发起一个Http请求到Config Service的notifications/v2接口

  • v2接口通过Spring DeferredResult把请求挂起,不会立即返回

  • 如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端

  • 如果发现配置有修改,则会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回

  • 客户端从返回的结果中获取到配置变化的namespace后,会立即请求Config Service获取该namespace的最新配置

4 源码解析实时推送设计

Apollo推送这块代码比较多,就不在本书中详细分析了,我把推送这块的代码稍微简化了下,给大家进行讲解,这样理解起来会更容易。当然我这边会比较简单,很多细节就不做考虑了,只是为了能够让大家明白Apollo推送的核心原理。

发送ReleaseMessage的逻辑我们就写一个简单的接口,用队列存储,测试的时候就调用这个接口模拟配置有更新,发送ReleaseMessage消息。


   
   
   
  1. @RestController

  2. public class NotificationControllerV2 implements ReleaseMessageListener {

  3. // 模拟配置更新,往里插入数据表示有更新

  4. public static Queue<String> queue = new LinkedBlockingDeque<>();

  5. @GetMapping("/addMsg")

  6. public String addMsg() {

  7. queue.add("xxx");

  8. return "success";

  9. }

  10. }

消息发送之后,前面我们有讲过Config Service会启动一个线程定时扫描ReleaseMessage表,去查看是否有新的消息记录,然后取通知客户端,这边我们也启动一个线程去扫描:


   
   
   
  1. @Component

  2. public class ReleaseMessageScanner implements InitializingBean {

  3. @Autowired

  4. private NotificationControllerV2 configController;

  5. @Override

  6. public void afterPropertiesSet() throws Exception {

  7. // 定时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值