深入理解Apollo核心机制之配置读取——ConfigService定时扫描

摘要:
在概述之前,我们了解到客户端将每秒轮询ConfigService很长时间(默认情况下),等待通知,然后主动拉取配置文件。本文主要跟踪ConfigService对ReleaseMessage表的主动轮询,通知相应侦听器的源代码,最后终止客户端长轮询的源代码。附件是上一个链接“深入了解阿波罗核心机制的配置读数-前言”。监听器介绍ConfigService中的一些类实现ReleaseMessageListener接口并重写handleMessage()方法。当ConfigService扫描到发布了新配置时,它将轮询实现上述侦听器接口的所有侦听器,并调用handleMessage()方法。
概述

之前我们了解了,客户端会每秒(默认)长轮询Config Service,等待通知,然后去主动拉取配置文件。本文主要跟进Config Service主动轮询ReleaseMessage表,并通知对应监听器的源码,最终终止客户端长轮询的源码。附上之前的链接《深入理解Apollo核心机制之配置读取——前言

监听器介绍

Config Service中有一些类实现了ReleaseMessageListener接口,并重写了handleMessage()方法,当ConfigService扫描到有新的配置发布的时候,就会轮询通知所有实现了上述监听器接口的监听器,调用handleMessage()方法。我们要了解的和客户端长轮询的监听器的类便是NotificationControllerV2。其它的监听器在配置发布的时候也有自己的职责,这里不过多介绍,我们只会查看NotificationControllerV2中的handleMessage()方法,了解它在接到通知的时候是如何处理消息的。

监听器注册

深入理解Apollo核心机制之配置读取——ConfigService定时扫描第1张

监听器结构

深入理解Apollo核心机制之配置读取——ConfigService定时扫描第2张

ReleaseMessageScanner#afterPropertiesSet() 开启扫描任务

首先看到ReleaseMessageScanner类,这个类就是做这件事情的。我们会发现它会开启一个定时扫描的任务(默认1秒间隔),具体看下面源码。
深入理解Apollo核心机制之配置读取——ConfigService定时扫描第3张

ReleaseMessageScanner#scanMessages() 扫描条件

深入理解Apollo核心机制之配置读取——ConfigService定时扫描第4张

ReleaseMessageScanner#scanAndSendMessages() 扫描并发送通知

Config Service会查出”当前最大扫描ID“后500条数据(根据ID升序),如果没有数据,则代表上次扫描之后,没有新的配置发布,如果有新的配置发布则会通知监听器。
深入理解Apollo核心机制之配置读取——ConfigService定时扫描第5张

必备Tip

客户端发起长轮询是请求NotificationControllerV2的pollNotification接口,经过一系列处理,会将请求的客户端保存下来。(Map形式,key为"{appId}+{clusterName}+{namespaceName}",value为List。所以,根据key就可以拿到一批关注该key(namespace)的客户端集合,最终调用setResult()即可结束长轮询。细节我们下次单独分析客户端长轮询相关的源码,本次只是关注定时扫描方向的源码主干。

下图代码便是该监听器的handleMessage()源码了,它会根据收到的”message",提取appId、clusterName、namespaceName,轮询通知根据key得到的DeferredResultWrapper集合(调用setResult()方法)。从而将通知信息(DeferredResult<ResponseEntity<List>>)返回给客户端。

深入理解Apollo核心机制之配置读取——ConfigService定时扫描第6张

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

上篇kubernetes 强制删除istio-system空间,强制删除podJava的泛型下篇

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

相关文章

MVVM大比拼之avalon.js源码精析

简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高。 将原始对象用object.defineProperty重写,不需要用户像用knockout时那样显示定义各种属性。 对低版本的IE使用了VBScript来兼容,一直兼容到IE6。 需要看基础介绍的话建议直接看司徒的博客。在网上搜...

layui.js源码分析

/*! @Title: Layui @Description:经典模块化前端框架 @Site: www.layui.com @Author: 贤心 @License:MIT */ ;!function(win) { "use strict"; var Lay = function() { this.v...

优秀开源项目的svn地址

很多优秀的开源项目已经提供SVN源码签出了,无论是解疑还是学习,都是一大幸福之事啊! Apache的SVN库,强烈推荐! http://svn.apache.org/repos/asf/  里面不但有Struts的源码,还有著名的Apache jakarta project 相当好的Web UI框架Tiles 现在很流行的项目管理工具Maven Ant、C...

【转】Android 源码编译make的错误处理--不错

原文网址:http://blog.csdn.net/ithomer/article/details/6977386 Android源码下载:官方下载或参考android源码下载方式 Android编译版本:PLATFORM_VERSION=4.0.1(最新Android 4.0.1) OS 操作系统平台:Linux yanggang 2.6.35-30-g...

【原创】简单快速软件开发平台,C/S架构二次开发平台

简单快速软件开发平台,二次开发平台 二次开发平台可根据企业的需求,灵活快速搭建企业业务管理系统,充分满足企业个性化的需求。C/S系统快速开发框架为企业和个人提供快速开发能力,能快速搭建C/S架构模式的企业管理应用系统。C/S系统快速开发框架提供开发大型软件系统的底层模板,基于开发框架的VS解决方案源码,改名为自己的软件系统名称,如:MyERP,MyMES等...

获取,修改进程命令行

在XDebug的源码学习中看到的命令行操作,将主要源码摘录出来做了个获取和更改进程命令行的Demo. 0x01  获取命令行      这里获取命令行的方式并不是通过调用GetCommandLine函数。    而是借由ntdll中的NtQueryInformationProcess函数查询ProcessBasicInformation,得到Process...