当前位置: 首页 > news >正文

Apollo Config原理浅析

文章目录

  • 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。

相关文章:

Apollo Config原理浅析

文章目录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是携程…...

Kubernetes二 Kubernetes之实战以及pod详解

Kubernetes入门 一 Kubernetes实战 本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。 1.1 Namespace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。…...

机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决

问题 1.无法外接显示器 最大的问题就是目前无法外接显示器,因为机械革命大多数型号笔记本电脑的HDMI、DP接口都是直接物理接在独显上的,内屏用核显外接显示器接独显,英伟达独显也是黑苹果无法驱动的,而且发现机械革命tpyec接口还…...

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

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

【Linux操作系统】【综合实验一 Linux操作基础】

文章目录一、实验目的二、实验要求三、实验内容四、实验报告要求一、实验目的 要求掌握Linux基础操作,熟悉Linux行界面,并明白操作的原理以及目的;熟悉Linux系统环境。 二、实验要求 通过这个第一阶段实验,要求掌握以下操作与相…...

关于监控服务器指标、CPU、内存、警报的一些解决方案

文章目录关于监控服务器指标、CPU、内存、警报的一些解决方案Prometheus Grafana 配置 IRIS / Cach 监控服务器Prometheus简介特点架构图Grafana简介特点配置流程自定义Prometheus接口定义配置 Exporter 监控服务器系统资源简介配置流程使用 Alertmanager报警简介配置流程基于…...

vue3全家桶技术栈基础(一)

在认识vue3全家桶之前,先简单回顾一下vue2的全家桶 一.在vue2中,全家桶技术栈 技术栈: vue2 vue-cli vuex3vue-router3webpack elementUI 1.vue-cli 脚手架构建vue项目,CLI 服务是构建于 webpack 和 webpack-dev-server构建快速生成一个vue2的开发项…...

群晖-第2章-设置HTTPS访问

群晖-第2章-设置HTTPS访问 本章介绍如何通过HTTPS访问群晖,前置要求是完成群晖-第1章-IPV6的DDNS中的内容,可以是IPV4也可以是IPV6,或者你有公网IP,直接添加DNS解析也可以。只要能通过域名访问到nas就行。 本文参考自群晖添加SS…...

005 利用fidder抓取app的api,获得股票数据

一、下载安装fidder 百度搜索fidder直接下载,按提示安装即可。 二、配置fidder 1. 打开fidder,选择tools——options。 2. 选择HTTPS选项卡,勾选前三项,然后点击右侧【actions】,选择【trust root certificate】&a…...

京东测试进阶之路:初入测试碎碎念篇

1、基本的测试用例设计方法 基本的测试用例设计方法(边界值分析、等价类划分等)。 业务和场景的积累,了解测试需求以及易出现的bug的地方。 多维角度设计测试用例(用户、业务流程、异常场景、代码逻辑)。 2、需求分析 …...

华为OD机试 - 乘积最大值(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】

乘积最大值 题目 给定一个元素类型为小写字符串的数组 请计算两个没有相同字符的元素长度乘积的最大值 如果没有符合条件的两个元素返回0 输入 输入为一个半角逗号分割的小写字符串数组 2 <= 数组长度 <= 100 0 < 字符串长度 <= 50 输出 两个没有相同字符的元…...

Java并发知识点

文章目录1. start()和run()方法的区别&#xff1f;2. volatile关键字的作用&#xff1f;使用volatile能够保证&#xff1a;防止指令重排3. sleep方法和wait方法有什么区别&#xff1f;sleep()方法4. 如何停止一个正在运行的线程&#xff1f;方法一&#xff1a;方法二&#xff1…...

前端 ES6 环境下 require 动态引入图片以及问题

前端 ES6 环境下 require 动态引入图片以及问题require 引入图片方式打包体积对比总结ES6 环境中&#xff0c;通过 require 的方式引入图片很方便&#xff0c;一直以来也没有出过什么问题&#xff0c;后来项目中&#xff0c;需要动态引入图片。 require 动态引入也容易实现&am…...

PCL 欧氏聚类分割

文章目录 一、应用背景1、点云分割算法的属性2、点云分割的挑战二、实现过程三、主要函数及代码实现1、主要函数2、核心代码3、效果实现四、参考文献一、应用背景 1、点云分割算法的属性 1)鲁棒性,比如树木是具有与汽车相区别的特征的,当点云数据的特征数量增加时,分割算…...

一台服务器最大能支持多少条TCP连接

一、一台服务器最大能打开的文件数 1、限制参数 我们知道在Linux中一切皆文件&#xff0c;那么一台服务器最大能打开多少个文件呢&#xff1f;Linux上能打开的最大文件数量受三个参数影响&#xff0c;分别是&#xff1a; fs.file-max &#xff08;系统级别参数&#xff09;&am…...

Teradata退出中国,您可以相信中国数据库!

继Adobe、Tableau、Salesforce之后&#xff0c;2023年2月15日&#xff0c;数仓软件巨头Teradata宣布将逐步结束在中国的直接运营。数仓界的“黄埔军校”仓皇撤出中国市场给出的理由非常含蓄&#xff1a;Teradata对中国当前和未来商业环境的慎重评估&#xff0c;我们做了一个艰难…...

markdown组合数学公式

markdown组合数学公式 $C_n^m$CnmC_n^mCnm​ $A_n^m$AnmA_n^mAnm​ $$\binom{m}{nm1}$$(mnm1)\binom{m}{nm1}(nm1m​) $${m\choose nm1}$$(mnm1){m\choose nm1}(nm1m​)...

Golang实践录:一个字符串比较示例

本文介绍两个含中文的字符串且针对相同位置字符的比较&#xff0c;给出实现代码。 起因 某工程需将接收的字符串和数据库里的指定字段值对比&#xff0c;该字符串含中文&#xff0c;两者允许个别字符有差异&#xff0c;差异数量3及以下的&#xff0c;认为相同。 字符串默认用…...

Linux后台开发工具箱-葵花宝典

目录目录 11. 前言 52. 脚本类工具 52.1. 双引号和单引号 52.2. 环境变量和变量 52.3. sed命令-字符串文本操作 62.4. sed和awk使用外部变量 62.5. awk 应用 62.5.1. awk给外部变量赋值 62.5.2. awk 多字符串分割 72.6. 日期操作 72.7. 设置shell模式 82.8. 设置shell提示 82.9…...

http的请求上下文

1.引入&#xff1a; 上下文是指HTTP框架为每个HTTP请求所准备的结构体。 HTTP框架定义的这个上下文是针对于HTTP请求的&#xff0c; 而且一个HTTP请求对应于每一个HTTP模块都可以有一个独立的上下文结构体&#xff08;并不是一个请求的上下文由所有HTTP模块共用&#xff09; 。…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...