深入理解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)

大家都在看

  • 01java大数据开发_Linux安装

    大数据开发01——linux环境安装配置 1.1软件包和资料 需要安装:VMware、CentOs6.5、Xfth5、Xshell5、Xmind; 需要可加V:zhanjiquan…

    Java 2023年6月8日
    0102
  • 微服务-springboot 部署无法读取文件 进行处理

    原因:本地用获取路径方式没问题,线上就出现打印 jar目录的问题。 第一种: java;gutter:true; String classpath = this.getClass(…

    Java 2023年6月9日
    071
  • nginx Segmentation fault (core dumped)

    1,问题描述 nginx运行正常,某些时候登陆服务器 nginx -t命令,突然出现 Segmentation fault (core dumped) 2,解决步骤 对nginx进…

    Java 2023年5月30日
    078
  • maven

    聚合 作用:聚合用于快速构建maven工程,一次性构建多个项目/模块。 制作方式: 创建一个空模块,打包类型定义为pom 定义当前模块进行构建操作时关联的其他模块名称 &#…

    Java 2023年6月7日
    072
  • SpringBoot学习笔记

    SpringBOOt概念 SpringBoot提供了一种快速使用Spring的方式,基于约定大于配置的思想,让开发人员专注于逻辑业务,从而提高开发效率 SpringBoot快速入门…

    Java 2023年6月5日
    084
  • git 常用操作

    可以把分支名理解为指针,比如 master,test,origin/master 等,都是一个指针,指向某次提交快照特殊指针HEAD:Git有一个名为 HEAD 的特殊指针,它是一…

    Java 2023年6月9日
    0105
  • 性能优化必备——火焰图

    引言 本文主要介绍火焰图及使用技巧,学习如何使用火焰图快速定位软件的性能卡点。结合最佳实践实战案例,帮助读者加深刻的理解火焰图构造及原理,理解 CPU 耗时,定位性能瓶颈。 背景 …

    Java 2023年6月15日
    069
  • [springmvc]mvc的多种方式实现请求转发与重定向

    3.restful风格 RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。 RESTFUL适用于移动互联网厂商作为业务接…

    Java 2023年6月6日
    096
  • 日程功能模块【从建模到代码实现】UML + JavaFX

    结合 uml 所学和 Javafx 从建模到实现一个子功能模块 —— 日程管理。新手上路,类图到代码实现的过程还是很曲折但所幸收获颇丰,记录一下学习心得。 日程功能模块 最后成果 …

    Java 2023年6月5日
    087
  • 分布式搜索引擎–03

    1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机…

    Java 2023年6月9日
    070
  • Lambda表达式工具类-日常搬砖

    众所周知,jdk8提供的Lambda表达式能帮我极大的精简代码,但是就在我们在实际使用过程中会有一些重复性的代码,比如对于stream来源的空判断处理,今天我就给大家整理了一些工具…

    Java 2023年6月5日
    078
  • 奇怪的知识又增加了,ImageMagick PDF转JPG图片合并的时候报Unsupported Image Type

    之前在PDF转JPG时使用了ImageMagic这个强大的工具,起初使用都没有什么问题,但是突然生产出现部分转换后的图片合并失败的问题 报错信息: javax.imageio.II…

    Java 2023年6月7日
    086
  • Linux中CentOS 7的安装及Linux常用命令

    前言 什么是Linux Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作…

    Java 2023年6月15日
    082
  • Java入门到精通——调错篇之Astah Community打开报需要jre1.7运行环境

    上网找了半天我只好进入官网和Astah Community的客服进行了邮件的提问并且及时的回复了我邮件如下: 点击以后官网上说了这么几句话 我就按照步骤在Astah Communi…

    Java 2023年5月29日
    086
  • 浅谈限流组件的应用和设计原则

    做业务的同学都知道,在现实情况中,往往会出现流量暴增的情况。这些流量可能来自于黑客的爬虫,也可能来自于节日大促,或者其他一些渠道。当然业界都有对策,比如反爬、熔断、降级、限流等等不…

    Java 2023年6月16日
    079
  • 用font Awesome 制作简单的博客园icon

    其中就有不少Brand Icon 像微信、微博。但是没有在Brand Icon里面找到博客园的Icon。 倒是在Web Application Icons 里找到了 fa-rss-…

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