Apollo Config原理浅析

news2024/12/23 0:10:16

文章目录

  • 1. 简介
  • 2. 基本功能
  • 3. Apollo关键功能实现原理
    • 3.1 框架整体原理
      • 3.1.1 Apollo角色
      • 3.1.2 框架执行原理
      • 3.1.3 整体组成
    • 3.2 细节实现
      • 3.2.1 Eureka和不同角色机器的关系
      • 3.2.2 Meta Server的作用
      • 3.2.3 ReleaseMessage消息实现原理
      • 3.2.4 Client的通信方式

1. 简介

apollo是携程框架研发部开源的一款分布式配置管理中心,可以集中管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,具备权限校验等特性。

框架是基于springboot和springcloud开发。

2. 基本功能

  1. 统一管理不同环境、不同集群的配置:支持在同一界面管理不同环境、集群和命名空间的配置;
  2. 界面功能丰富:支持配置发版、配置回滚、灰度发布等功能;
  3. 配置修改实时生效(热发布)
  4. 权限管理和审计:应用配置有完善的权限管理机制,按配置分为编辑和发布两个环节,支持查看配置改动历史。

Apollo实现高可用依赖于Eureka,至于为什么使用Eureka官方给出的理由为:

  1. 项目本身就使用了Spring Cloud和Spring Boot,同时Spring Cloud还有一套非常完善的开源代码来整合Eureka,使用起来非常方便;
  2. Eureka还支持在我们应用自身的容器中启动,也就是说我们的应用启动完之后,既充当了Eureka的角色,同时也是服务的提供者。这样就极大的提高了服务的可用性;
  3. 为了提高配置中心的可用性和降低部署复杂度,我们需要尽可能地减少外部依赖。

3. Apollo关键功能实现原理

3.1 框架整体原理

3.1.1 Apollo角色

Apollo框架分为五种角色:

  1. Client:运行在开发者业务等系统的SDK,负责从Meta Server拉取Config Service服务的地址并拉取监听配置数据;
  2. Portal:配置发布者操作的配置页面,负责从Meta Server拉取Admin Service服务的地址并发布配置修改请求;
  3. Meta Server:Eureka集群的消费者,负责从Eureka集群拉取Admin和Config Service并缓存在本地,为Client和Portal提供统一封装后的HTTP接口;
  4. Admin Service:Eureka集群的服务提供者,会将自身注册在Eureka集群中,同时接收Portal管理端的修改数据请求;
  5. Config Service:Eureka集群的服务提供者,会将自身注册在Eureka集群中,同时接收Client的拉取监听数据请求;
  6. PortalDB:存储一些环境变量,及配置环境等信息的数据库,注意该库不存储配置信息,不管是单机还是多机只需要一个portalDB;
  7. ConfigDB:存储Apollo的配置信息。

3.1.2 框架执行原理

架构图片

框架整体执行原理:

  1. 启动Eureka集群,以便Apollo机器完成注册发现;
  2. 启动Admin Service,将自身注册到Eureka集群中,并保持心跳;
  3. 启动Config Service,将自身注册到Eureka集群中,并保持心跳;
  4. 启动Meta Server,从Eureka集群中发现拉去Admin Service和Config Service的机器信息;
  5. Client端的SDK启动,通过SLB或nginx的负载均衡请求Meta Server,拉取Config Service的机器信息;
  6. Client向Config Service拉取数据并使用长轮询监听配置改动;
  7. 配置管理员在Portal上修改文件数据,Portal向Admin Service发起配置修改请求;
  8. Admin Service接收到修改请求后,发送ReleaseMessage给Config Service;
  9. Config Service接收到ReleaseMessage后通过长轮询回调给Client;
  10. Client接收到新的配置修改信息,刷新本地缓存。

3.1.3 整体组成

Apollo个人倾向于将其分为三个部分:

  1. Portal+Admin Service管理端部分:Apollo的配置提供者,主要负责修改管理配置,发生配置修改后发布配置改动事件;
  2. Meta Server+Eureka+Config Service核心部分:这部分会完成集群内部的服务发现注册,并向外提供对应的API接口;
  3. Client部分:Apollo的配置消费者,向Apollo拉取服务信息并发起长轮询拉取监听数据。

从Apollo官方推荐的部署方式可以看出来他们也倾向于这样划分,多机部署架构图如下:

部署架构图

MetaServer、Eureka和Config Service可以简化为Config Service。如果要高可用则在此基础上多新增几台Admin Service或Config Serivce,如果要多环境则在此基础上新增不同的Linux Server1集群。

这样划分最核心的原因是:MetaServer、Eureka和Config Service这三个角色在同一个JVM进程中,也就是一定在同一台机器上。而Admin Service在一个JVM中,Portal在一个JVM中。

3.2 细节实现

3.2.1 Eureka和不同角色机器的关系

和Eureka有直接关系的是Meta Server、Config Service和Admin Service,Apollo中其它的组件或角色都和Eureka没有关系。

对Eureka来说,Config Service和Admin Service是服务提供者,会主动将自己的信息注册到Eureka中,而Meta Server则作为服务消费者从Eureka上拉取所有服务提供者的信息。

由于Apollo自己在框架内集成了Eureka,所以在部署Apollo时无需额外再创建一个Eureka集群,如果想要Apollo接入现存的Eureka集群,可使用如下方法:

  1. 使用1.5.0之后的版本;
  2. 配置apollo.eureka.server.enabled=false;
  3. 把serverconfig表的eureka.service.url字段改成自己的eureka路径。

3.2.2 Meta Server的作用

Meta server在整个体系中为Eureka Client,负责从Eureka中发现服务,Meta Server的作用便是封装接口数据,从Eureka中拉取数据后向client和portal开放不同的接口,让client和portal只用关注自身的一个http接口,而无需关心Eureka的数据格式及如何过滤configService或adminService。

3.2.3 ReleaseMessage消息实现原理

当Admin Service收到了修改数据的请求,并完成了数据修改落库后,需要向其它的Config Service发布修改事件,这个使用场景很容易想到消息队列。Apollo使用了数据库表来模拟消息队列,其实现为:

  1. Admin Service往ReleaseMessage表中写入一条改动配置记录;
  2. 所有的Config Service每秒定时轮询ReleaseMessage表,这就是为什么Apollo说是秒级的热发布性能;
  3. 当发现配置表有新的记录写入时,则说明配置发生了改动,此时会通过长轮询返回给Client。

3.2.4 Client的通信方式

Client请求Meta Server使用普通的HTTP方式调用来拉取Config Service服务的ip+port。

cLIENT向Config Service发起http long polling,超时时间为60s,没获取到配置则返回304,有数据则异步通知客户端请求,客户端接收到数据返回更新本地缓存。除了http长轮询,客户端默认会每隔5min向configService拉取一次数据,一般而言是304。可通过System Property: apollo.refreshInterval覆盖。拉取下来的数据会在本地生成文件,以防止远程服务异常无法启动。

负载均衡和错误重试都是在client端完成的,负载均衡方式:

  1. 优先访问通知配置变更的configService,以便更快的正常访问;
  2. 若访问加载速度过快被限流,则sleep 5s;
  3. 访问失败会计算重试时间间隔,单位s。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 实现 图象扩增(对原始图象进行增强,再保存下来) 同时符合交叉验证要求

图象扩增1 思路2 交叉验证实现3 数据扩增并且保存4 读原始交叉验证文件,针对argu文件夹新写一个5 模型Dataset6 总结和建议本文是图象分割数据集进行数据扩增,和图象分类进行数据扩增有稍许不同需求: 已有的图象分割数据集已经进行了五折交叉…

哈希表的介绍

1.哈希表的介绍 在哈希表中插入、删除或查找一个元素都只需要O(1)的时间,因此经常被用来优化时间效率。 在Java中,哈希表有两个对应的类型,即HashSet和HashMap。 2.HashSet的应用 若每个元素都只有一个值,则用HashSet&#xf…

2019蓝桥杯真题旋转 C语言/C++

题目描述 图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。 我们用一个 nm 的二维数组来表示一个图片,例如下面给出一个 34 的 图片的例子: 1 3 5 7 9 8 7 6 3 5 9 7 这个图片顺时针旋转 90 度…

2.20jdbc

一.数据库编程的必备条件编程语言:java c c Python数据库 Oracle,MySQL,SQL Server数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包:MySQL提供了Java的驱动包mysqlconnector-java,需要就Java操作MySQL需要该驱动包二.Java的数据库编程JDBC,即…

UG NX二次开发(C#)-导出-导出Parasolid文件(.x_t文件)

文章目录 1、前言2、在UG NX中的操作2、采用NXOpen二次开发实现1、前言 UG NX提供了多种文件的导入与导出功能,本文采用NXOpen.net来实现Parasolid文件(.x_t文件)的导出功能。 2、在UG NX中的操作 打开UG NX的一个三维模型,如下图所示。 点击“文件”->“导出”->“…

约束优化:约束优化的三种序列无约束优化方法

文章目录约束优化:约束优化的三种序列无约束优化方法外点罚函数法L2-罚函数法:非精确算法对于等式约束对于不等式约束L1-罚函数法:精确算法内点罚函数法:障碍函数法等式约束优化问题的拉格朗日函数法:Uzawas Method fo…

Win10 环境 安卓ollvm编译与配置 ndk代码混淆加密

确定你正在使用的ndk版本 查看build.gradle ndkVersion 21.4.7075529 确定你使用的ndk的ollvm版本 C:\Users\Administrator\AppData\Local\Android\Sdk\ndk\21.4.7075529\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-config.exe --version 9.0.9svn 确定了ollvm版本后…

Java序列化机制

Java序列化机制 概述 java中的序列化可能都停留在实现Serializable接口上,对于它里面的一些核心机制没有深入了解过。直到最近在项目中踩了一个坑,就是序列化对象添加一个字段以后,使用方系统报了反序列化失败,原因是我们双方的…

【ArcGIS Pro二次开发】(6):工程(Project)的基本操作

在ArcGIS Pro中我们对工程的基本操作一般包括打开、新建、保存等。下面演示在二次开发中如何用代码进行以上操作。 新建一个项目,命名为【ProjectManager】,添加8个按钮,命名为【CreateEmptyProject、CreateProjectByDefault、OpenExProjest…

易基因|MeRIP-seq揭示m6A RNA甲基化通过调控组蛋白泛素化来促进癌症生长和进展:Cancer Res

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2022年05月16日,《Cancer Res》杂志发表了题为“M6A RNA Methylation Regulates Histone Ubiquitination to Support Cancer Growth and Progression”的研究论文,该…

Python解题 - CSDN周赛第30期 - 天然气订单

本期比赛的在线测试系统好像出了点问题,导致很多选手最后提交的分数是0,而问哥也遇到好几次提交后一直显示“运行中”而没有结果的情况。鉴于之前遇到过类似情况,不停地刷新页面才得以继续。但是此问题已经存在并持续了好几期,极大…

三、NetworkX工具包实战2——可视化【CS224W】(Datawhale组队学习)

开源内容:https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频:https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页:https://web.stanford.edu/class/cs224w NetworkX…

【Python--XML文件读写】XML文件读写详解

【Python–XML文件读写】XML文件读写详解 文章目录【Python--XML文件读写】XML文件读写详解1. 前言1.1 介绍1.2 用法2. xml文件内容形式3. xml文件读写3.1 项目框架3.1 写入操作(创建)(create_xml.py)3.2 读取操作(解析…

虚拟 DOM 详解

什么是虚拟 dom? 虚拟 dom 本质上就是一个普通的 JS 对象,用于描述视图的界面结构 在vue中,每个组件都有一个render函数,每个render函数都会返回一个虚拟 dom 树,这也就意味着每个组件都对应一棵虚拟 DOM 树 查看虚拟…

Linux docker(03)可使用GPU渲染的x11docker实战总结

该系列文章的目的旨在之前的章节基础上,使用x11docker构建一个可以使用GPU的docker容器。该容器可以用于3D图形渲染/XR 等使用GPU渲染的程序调试和运行。 0 why docker 为什么非要用x11docker,而不是其他的docker呢? 因为一般的docker是不…

这么好的政策和创新基地,年轻人有梦想你就来

周末有空去参观了下一个朋友办的公司。位置和环境真不错,且租金低的离谱,半年租金才2000元,且提供4个工位。这个创新基地真不赖啊,国家鼓励创新创业,助力年轻人实现梦想。场地有办公区,休息区应有尽有&…

linux集群技术(一)--LVS(负载均衡)(一)

集群功能分类负载均衡LVS概述LVS工作模式轮训算法 1.集群功能分类 1.1 LB (一)简介 LB:Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的…

CData Drivers for Avro v22

CData Drivers for Avro v22 从报告工具或数据库加入ApacheAvro。您还可以根据标准通过驱动程序连接到自定义应用程序。 与BI分析、报告、ETL工具和定制解决方案集成。 用于Avro的CData驱动程序功能强大: BI和分析 我们的驱动程序提供了将实时Avro数据连接到分析、B…

QT 设计一个串口调试工具,用一个工程就能轻松解决,外加虚拟串口工具模拟调试,在日常工作中可类比模块间通信,非常详细建议收藏

QT 串口调试工具第一节 虚拟串口工具安装第二节 QT创建一个基于QWidget的项目第三节 UI界面设计第三节 项目头文件widget.h第四节 项目实现文件widget.cpp第五节 main函数第六节 编译结果重点第七节 使用QT打包程序,不安装QT的电脑可使用第一节 虚拟串口工具安装 -…

【C++】模拟map和set以及改造红黑树

文章目录1、set和map的基础用法1.1 set的基本使用1.2 map的基本使用2、set和map的模拟实现2.1 建立map和set类2.1 红黑树的完善1、set和map的基础用法 stl中,像vector、list、deque等这样的容器,称之为序列式容器,其底层是线性序列的数据结构…