深入理解Apollo核心机制之配置读取——前言

前言

Apollo是当下较为火热的配置中心,顾名思义自然是管理配置的,那么它是如何获取配置的呢?本文会简单介绍相关机制,很多东西自然解释得不到位,后续会有单独章节深追源码看具体实现的。

配置获取方式

Apollo有两种方式获取配置:
1)客户端定时请求Config Service的配置读取接口;
2)客户端长轮询Config Service的配置变更通知接口,当客户端收到变更通知之后会立即轮询Config Service的配置读取接口。

关键核心类

  1. com.ctrip.framework.apollo.internals.RemoteConfigRepository :实现AbstractConfigRepository抽象类,远程配置Repository。实现从Config Service拉取配置,并缓存在内存中。并且定时+实时刷新缓存。
  2. com.ctrip.framework.apollo.internals.RemoteConfigLongPollService :长轮询的核心类,就是拼接URL请求Config Service的notifications/v2接口,等待获取配置更新通知。
  3. com.ctrip.framework.apollo.biz.message.ReleaseMessageScanner :客户端感知配置发生变化的核心类。

客户端如何感知配置变化?

  1. Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录;
  2. Config Service会启动一个线程定时扫描ReleaseMessage表(默认是1秒)查看是否有新的消息记录;
  3. Config Service发现有新的消息记录,就会通知到所有的消息监听器;
  4. 消息监听器得到配置发布的消息后,就会通知对应的客户端。(之后就是客户端主动去拉取配置了)

深入理解Apollo核心机制之配置读取——前言

Config Service如何通知客户端?

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

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

总结

咱们知道Apollo有专属的数据库:ApolloPortalDB、ApolloConfigDB,所以数据都是放在这些库里的,自然包括配置信息。所以无非就是新增配置信息(发布)的时候,某表有新数据,与此同时客户端定时去扫描查看这张表看看有没有更新,如果有更新那么就通知客户端,告诉客户端哪个namespace的配置更新了,然后客户端再去主动调用拉去配置的接口获取新的配置;当然这保证的实时性,期间可能会发生各种问题导致配置有问题,咱们客户端还有一种拉取配置的方式那就是每5分钟也会主动调用拉取配置的接口获取配置,这样就保证了配置的数据一致性。不得不提的是,Apollo还有本地文件缓存和内存缓存(默认不开启),这就保证了Apollo服务不可用的时候短时间内也不会影响到客户端(因为客户端依旧可以从缓存中读取配置),设计非常的严谨与优秀!

上文中提到的DeferredResult,可能有的小伙伴没有接触过。我在这里简单地举个例子,希望你能明白~
类似于,你去超市买一样东西,但是此时这东西没货,那么你留个电话给服务员,自己去做别的事情了,而服务员会不停地问仓库有没有货了,当有货的时候他会打电话告诉你(类似调用setResult方法),这时候你就会屁颠屁颠地拿着货走了。(比喻可能不够恰当和严谨,但是一般精辟就行,希望你能领悟~)
用正式一点的技术用语来描述呢就是,DeferredResult:当一个请求到达API接口,如果该API接口的return返回值是DeferredResult,在没有超时或者DeferredResult对象设置setResult时,接口不会返回但是Servlet容器线程会结束DeferredResult另起线程来进行结果处理(即这种操作提升了服务短时间的吞吐能力)。如此一来,这个请求不会占用服务连接池太久,如果超时或者setResult,接口会立即返回。

Original: https://www.cnblogs.com/deepSleeping/p/14565677.html
Author: DeepSleeping丶
Title: 深入理解Apollo核心机制之配置读取——前言

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574553/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PythonWeb开发

    1.什么是Flask?有什么优点? 2.Django和Flask有什么区别? 3.Flask-WTF是什么,有什么特点? 4.Flask脚本的常用方式是什么? 5.如何在Flask…

    Java 2023年6月7日
    080
  • Nginx的安装与运行

    前言:本文是基于虚拟机上的centOS 7对Nginx的安装,可以使用 uname -a查看centOS系统版本,本文用来记录安装nginx的步骤和相关命令,方便日后使用时查看。 …

    Java 2023年6月5日
    078
  • Spring Cloud Feign 服务消费调用(三)

    序言 Spring Cloud Netflix的微服务都是以HTTP接口的形式暴露的,所以可以用Apache的HttpClient或Spring的RestTemplate去调用 而…

    Java 2023年5月30日
    072
  • Java中对域和静态方法的访问不具有多态性

    1.将方法调用同方法主体关联起来被称为 2.编译期绑定(静态)是在程序编译阶段就确定了引用对象的类型 3.运行期绑定(动态绑定)是指在执行期间判断所引用对象的实际类型,根据其实际的…

    Java 2023年6月16日
    071
  • Java基础 awt Frame 设置窗体的大小 位置 可见性

    JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code packag…

    Java 2023年5月29日
    070
  • Java8 List去掉重复对象以及保证添加顺序

    JAVA中List对象去除重复值,大致分为两种情况,一种是List、List这类,直接根据List中的值进行去重,另一种是List这种,List中存的是javabean对象,需要根…

    Java 2023年5月29日
    0101
  • Java实现按行读取大文件

    非频繁操作如下: String file = "F:" + File.separator + "a.txt"; FileInputStrea…

    Java 2023年5月29日
    076
  • Java Excel 文件导出导入

    1 import com.fasterxml.jackson.databind.exc.InvalidFormatException; 2 import com.sensetime…

    Java 2023年5月29日
    061
  • JVM学习笔记之垃圾收集算法【四】

    一、什么是垃圾回收? 垃圾回收(英语:Garbage Collection,缩写为 GC),在计算机科学中是一种自动的存储器管理机制。当一个电脑上的动态存储器不再需要时,就应该予以…

    Java 2023年6月5日
    0129
  • 聊聊支付流程的设计与实现逻辑

    新手打怵老手头疼的业务; 一、业务背景 通常在业务体系中,都会或多或少的涉及到支付相关的功能;对于一些经验欠缺同学来说,最紧张的就是面对这类支付结算的逻辑,因为流程中的任何细节问题…

    Java 2023年6月15日
    093
  • Leetcode链表

    Leetcode链表 边学边刷的……慢慢写慢慢更 题干: 思路: 删除链表节点,就多了一个判断等值。 由于是单向链表,所以要删除节点时要找到目标节点的上一个…

    Java 2023年6月7日
    087
  • WPF 自定义可拖动标题栏

    要注意,拖拽的地方,需要加背景色,否则 DrageMove 将无效 MainWindows.xaml <Window x:Class="Report.MainWin…

    Java 2023年6月14日
    069
  • 使用LS2J技术在LotusScript中使用Java

    首先需要在代理的 (Options)部分,添加如下: Uselsx “*javacon” 2.我们自己写一个java的script库,其中包含一个Java类…

    Java 2023年5月29日
    072
  • Leetcode随缘刷题之寻找两个正序数组的中位数

    我一上来没读清题,想着这题这么简单,直接就上手写了: package leetcode.day_12_05; import java.util.ArrayList; import …

    Java 2023年6月7日
    065
  • Oracle 11g UNDO 管理 详解

    从Oracle 11g 开始,使用默认安装时,Oracle 会自动管理UNDO,之前也整理过几篇有关UNDO的文章,如下: Oracle undo 表空间管理 整理的都比较散,所以…

    Java 2023年5月30日
    075
  • JS使用BLOB方式下载Excel导致文件损坏的问题解决

    这两天写一个后台生成Excel返回前端下载的功能,遇到了一个问题,记录一下。 前端点击下载按钮,文档损坏,但是使用Postman调用下载,文档却是正常的。 exportExcel(…

    Java 2023年6月9日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球