当前位置: 首页 > 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; 。…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...