深入理解Apollo核心机制之配置读取——轮询

摘要:
前两篇文章,“深入了解阿波罗核心机制的配置读数-前言”和“深入理解阿波罗核心机制配置读数-ConfigService定时扫描”,概述了读取配置。除了轮询接口拉取配置的默认5分钟间隔外,客户端还会长期主动轮询ConfigService,并在等待通知后主动拉取配置。并通知RemoteConfigRepository#loadApolloConfig()拉取配置拼接URL,并请求ConfigService接口拉取配置AbstractConfigRepository#fireRepositoryChange,以将配置更改通知侦听器返回长轮询。将客户端拼接请求发送到ConfigService的NotificationControllerV2#pollNotification接口后会发生什么?

前两篇内容
深入理解Apollo核心机制之配置读取——前言
深入理解Apollo核心机制之配置读取——ConfigService定时扫描

概述

读取配置除了默认5分钟间隔去轮询接口拉取配置,还有客户端主动长轮询ConfigService,等待通知后主动拉取配置。本文就看看客户端是如何开始客户端轮询的,以及轮询中的具体细节。

RemoteConfigRepository#RemoteConfigRepository(String namespace) 初始化工作

该构造函数会初始化命名空间,配置缓存等许多基本信息,同时有一步就是将自己(this)注册进RemoteConfigLongPollService,因为后续长轮询其实是该Service统一去做的。
深入理解Apollo核心机制之配置读取——轮询第1张

RemoteConfigRepository#scheduleLongPollingRefresh() 注册接口

m_namespace是在初始话的时候设置的,它表示该Repository所对应的命名空间。
深入理解Apollo核心机制之配置读取——轮询第2张

RemoteConfigLongPollService#submit(String namespace, RemoteConfigRepository remoteConfigRepository) 正式注册并开始开启长轮询准备工作

深入理解Apollo核心机制之配置读取——轮询第3张

RemoteConfigLongPollService#startLongPolling() 准备正式开启长轮询

深入理解Apollo核心机制之配置读取——轮询第4张

RemoteConfigLongPollService#doLongPollingRefresh(String appId,String cluster,String dataCenter) 长轮询开始

通过封装了Eureka的MetaService获取ConfigService集群,然后硬核负载均衡打到ConfigService的长轮询接口开始长轮询等待通知,如果关注的namespace有更新,则会做一些更新本地成员变量的操作,最重要的就是会通知相关的注册进来的Repository去主动拉取配置。这就是客户端长轮询等待通知,发现有配置更新后主动去拉取配置的一个基本流程。注意,当发送请求到长轮询接口的时候会被ConfigService hold住,直到响应或者超时。稍后再看NotificationControllerV2那边的流程。我们先关注客户端长轮询、获取通知、主动轮询拉取配置接口的过程。

深入理解Apollo核心机制之配置读取——轮询第5张

RemoteConfigLongPollService#notify(ServiceDTO lastServiceDTO, List notifications) 长轮询结果通知客户端

根据通知中传递的namespaceName,去之前注册的Repository集合Map拿到关注该namespaceName的Repository

深入理解Apollo核心机制之配置读取——轮询第6张

RemoteConfigRepository#onLongPollNotified(ServiceDTO longPollNotifiedServiceDto, ApolloNotificationMessages remoteMessages) 准备同步配置

深入理解Apollo核心机制之配置读取——轮询第7张

AbstractConfigRepository#trySync() 准备同步配置

缓存中拿一份,远程拉取一份,比较后更新内存缓存。并通知

深入理解Apollo核心机制之配置读取——轮询第8张

RemoteConfigRepository#loadApolloConfig() 拉取配置

拼接URL请求ConfigService接口拉取配置

深入理解Apollo核心机制之配置读取——轮询第9张

AbstractConfigRepository#fireRepositoryChange(String namespace, Properties newProperties) 通知监听器配置改变(实时修改配置)

深入理解Apollo核心机制之配置读取——轮询第10张

回到长轮询,话说客户端拼接请求打到ConfigService的NotificationControllerV2#pollNotification接口后是什么情况呢?

NotificationControllerV2#pollNotification 拉取(等待)通知

有一个Multimap<String,DeferredResultWrapper>,以key(appId+cluster+namespace)和List存储watchKey和客户端的关系。
每一次请求,都会创建一个DeferredResultWrapper,然后通过一系列操作最后将自己注册进上述集合,等待handleMessage调用setResult(结束长轮询)或者超时,这样就把Result返回给客户端了。
客户端就可以获得变更通知从而知道是什么namespace变更了,然后会主动拉取对应配置。

深入理解Apollo核心机制之配置读取——轮询第11张

免责声明:文章转载自《深入理解Apollo核心机制之配置读取——轮询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信企业号获取OpenID过程Linux下的crontab定时、执行任务命令详解 oracle 自动备份下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用.Net访问Office编程接口

在这篇文章里面,我将向大家介绍如何在.Net中访问Office所公开的编程接口。其实,不管是使用哪种具体的技术来针对Office进行开发(比如VSTO,或者用C#编写一个Office Add-in,或者在一个WinForms程序中调用Office的功能,甚至在一个ASP.NET应用的服务器端启动一个Excel进程),只要是基于.Net平台,这篇文章所描述的...

java爬虫(六)分析AJAX接口获取网页动态内容

1.实现原理 2.详细过程 这里我们直接观察审查元素(检查)中的内容来判断接口 这里我选取了一个动态网页的查看更多,直接点击然后观察network选项卡的变化这里可以看到网页在无刷新的状态下,通过查看更多加载了很多图片资源,其中第一个文件,查看一下它的Preview选项卡,可以看到这个文件是存储json的 然后通过Headers选项卡,我们可以看到它请求的...

App接口如何保证安全

微信开发或者高德地图,百度地图什么的api要使用,使用之前都需要注册一个账号,然后系统会给你一个key,然后调用api的时候把key传给服务器。 平常公司内部开发项目时,直接用mvc为app客户端提供接口,没有做过验证。 本次为了安全,所以需要考虑解决下安全问题。咨询了同学,有人提出,自己定义一个加密字符串+实时的一个时间戳,对称加密。app每次请求接口,...

java GUI(图形用户界面)

GUI Graphical User Interface(图形用户接口)。 用图形的方式,来显示计算机操作的界面,这样更方便更直观。 CLI Command line User Interface (命令行用户接口) 就是常见的Dos命令行操作。 需要记忆一些常用的命令,操作不直观。 举例:  比如:创建文件夹,或者删除文件夹等 Java为GUI提供的对象...

面向接口编程的基本原则

1. 单一职责原则SRP ( Single Responsibility Principle ) 对于单一职责原则,其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责 定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相...

fiddler:快速标识接口

最近做了很火的直播答题,当然页面比较简陋,h5页面+http接口。 答题活动需要数据实时同步,即前端会高频重复的去调一些接口,使用fiddler抓包时,因为刷新速度过快,当接口出问题的时候,排查起来较慢。 此时对接口做个标记,会大大提高工作效率 使用fiddler的 autoresponder即可 此处写几个常用的,其中 添加注释文案、加粗非常好用 1 标...