Apollo介绍和入门
文章目录
- Apollo介绍
- 配置中心介绍
- apollo介绍
- 主流配置中心
- 功能特性对比
- Apollo简介
- 入门
- 简单的执行流程
- Apollo具体的执行流程
- Apollo对象
- 执行流程
- 分步执行流程
- 核心概念
- 应用,环境,集群,命名空间
- 企业部署方案
- 灰度发布
- 全量发布
- 配置发布的原理
- 发送ReleaseMessage
- Config Service通知客户端
- 客户端读取设计
Apollo介绍
配置中心介绍
- 分布式系统环境下,给其他服务提供配置文件的管理,统一管理各种应用配置的一个基础服务组件
apollo介绍
Apollo(阿波罗)是携程开源的一款可靠的分布式配置管理中心,它能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景
主流配置中心
目前市面上用的比较多的配置中心有:
- Spring Cloud Config
- 2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
- GitHub地址
- https://github.com/spring-cloud/spring-cloud-config
- Nacos
- 2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。
- GitHub地址
- https://github.com/alibaba/nacos
- Apollo
- 2016年5月,携程开源的配置管理中心
- 能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端
- 并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
- GitHub地址
- https://github.com/apolloconfig
功能特性对比
功能点 | Spring Cloud Config | Apollo | Nacos |
---|---|---|---|
配置实时推送 | 支持 | 支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) |
版本管理 | 支持 | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 不支持 |
权限管理 | 支持(依赖Git) | 支持 | 不支持 |
多语言 | 只支持Java | 主流语言,提供了Open API | 主流语言,提供了Open API |
- 总结
- Spring Cloud Config 与 Apollo类似,但只支持 Java,所以不用 Spring Cloud Config
- Nacos 不支持 灰度发布 和 权限管理,所以不用 Nacos
Apollo简介
- Apollo 是 一个 分布式配置中心的解决方案
- Apollo 包括
- 服务端
- 服务端基于 Spring Boot 和Spring Cloud 开发
- 客户端
- Java客户端不依赖任何框架
- 服务端
- Apollo 特性:
- 统一管理不同环境,不同集群的配置
- 提供了一个Apotal界面来管理
- 热发布
- 用户在Apollo修改完配置并发布后
- 客户端能实时(1秒)接收到最新的配置,并通知到应用程序
- 版本发布管理
- 所有的配置发布都有版本概念
- 从而可以方便地支持配置的回滚
- 灰度发布
- 支持配置的灰度发布
- 比如点了发布后,只对部分应用实例生效
- 等观察一段时间没问题后再推给所有 应用实例
- 支持配置的灰度发布
- 统一管理不同环境,不同集群的配置
入门
简单的执行流程
- 四个对象:
- 配置中心
- 客户端
- 应用程序
- 本地文件缓存
- 执行流程
1、在Apollo配置中心修改配置
2、应用程序通过Apollo客户端从配置中心拉取配置信息
用户通过Apollo配置中心修改或发布配置后,会有两种机制来保证应用程序来获取最新配置:
- 一种是Apollo配置中心会向客户端推送最新的配置;
- 另外一种是Apollo客户端会定时从Apollo配置中心拉取最新的配置
通过以上两种 机制共同来保证应用程序能及时获取到配置。
Apollo具体的执行流程
Apollo对象
- Config Service
- 配置的读取和推送
- 客户端通过 Config Service 读取配置
- Admin Service
- 配置的修改,发布
- Portal 通过 Admin Service 将配置写到ConfigDB数据库中
- Eureka 注册中心
- 服务注册和发现
- 记录 Config Service 和 Admin Service 的信息
- IP地址,端口等
- 方便客户端和Portal 的访问
- Meta Server
- 在Eureka 之上架了一层Meta Server
- 用于封装Eureka的服务发现接口
- Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
执行流程
- 客户端读取配置流程
- 通过域名访问Meta Server获取Config Service服务列表(IP+Port
- 而后直接通过IP+Port访问服务
- 修改配置的流程
- Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port)
- 而后直接通过IP+Port访问服务
- Ps:
- 为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程 中
分步执行流程
- Apollo启动后
- Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。
- Apollo Client和Portal管理端通过配置的Meta Server的域名地址
- 经由Software Load Balancer**(软件负载均衡** **器)进行负载均衡后分配到某一个Meta** Server
- Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
- Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试
- 获取到正确的Config Service和Admin Service的服务信息后
- Apollo Client通过Config Service为应用提供配置获取、实时更新等功能;
- Apollo Portal管理端通过Admin Service提供配置新增、修改、发布等功能
核心概念
应用,环境,集群,命名空间
-
应用
- 就是实际使用配置的应用
- Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
- 关键字: appId
- 就是实际使用配置的应用
-
环境
- 配置对应的环境
- Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
- 关键字: env
- 配置对应的环境
-
集群
- 一个应用下不同实例的分组
- 比如典型的可以按照数据中心分
- 把上海机房的应用实例分为一个集群
- 把北京机房的应用实例分为另一个集群。
- 关键字:cluster
-
关系
- 应用 --> 环境 --> 集群
- 应用 : 工程项目
- 应用分环境
- 具体环境下边
- 由于部署的集群不同,导致配置的不同
- 北京和上海数据库的地址不同,虽然都是生产环境
- 由于部署的集群不同,导致配置的不同
- 具体环境下边
- 应用 --> 环境 --> 集群
-
命名空间
-
一个应用下不同配置的分组
- 配置通过key,value 存储
-
通过namespace对我们的配置项进行分类管理
- 不同类型的配置存放在不同的文件中
- 数据库配置文件,RPC配置文件,应用自身的配置文件
- 在添加配置的时候,要记得对配置项进行分类
- 不同类型的配置存放在不同的文件中
-
公共和私有:
-
有共用的情况,公共命名空间可以继承
- 有5个工程都会连接数据库,数据库的配置就共用了
- 就可以建一个公共的命名空间(例如数据库的连接)
- 生产环境里面的命名空间可以继承公共的命名空间
- 生产环境就可以直接拿到数据库的连接
- 可以在生产环境中再做个性化定义
企业部署方案
在企业中常用的部署方案为:
- Apollo-adminservice (发布配置)和Apollo-configservice (查询配置)两个服务
- 分别在线上环境(pro),仿真环 境(uat)和开发环境(dev)各部署一套
- 并且还要建立不同的 apolloconfigdb
- 因为配置信息在不同的数据库当中
- Apollo-portal做为管理端
- 管理界面,只部署一套
- 统一管理上述三套环境。
- 通过一个portal管理界面,连接访问不同的生产环境
- 管理界面,只部署一套
具体如下图所示:
灰度发布
- 定义:
- 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。
- 在其上可以进行A/B testing
- 即让一部分用户继续用 产品特性A
- 一部分用户开始用产品特性B
- 如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁 移到B上面来。
- Apollo实现的功能
- 对于一些对程序有比较大影响的配置
- 可以先在一个或者多个实例生效,观察一段时间没问题后再全量发布 配置。
- 对于一些需要调优的配置参数
- 可以通过灰度发布功能来实现A/B测试。
- 可以在不同的机器上应用不同的配 置,不断调整、测评一段时间后找出较优的配置再全量发布配置。
- 对于一些对程序有比较大影响的配置
全量发布
- 灰度发布测试完成后,全量发布
配置发布的原理
- 参考链接
- https://www.iocoder.cn/categories/Apollo/
- 用户在Portal操作配置发布
- Portal调用Admin Service的接口操作发布
- Admin Service发布配置后,发送ReleaseMessage给各个Config Service
- Config Service收到ReleaseMessage后,通知对应的客户端
发送ReleaseMessage
- 通过数据库实现了一个简单的消息队列
具体实现方式如下:
-
Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录
- 消息内容就是配置发布的AppId****+Cluster+Namespace
- 源码:
- 消息发送类: DatabaseMessageSende
- https://github.com/ctripcorp/apollo/blob/master/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/message/DatabaseMessageSender.java
-
Config Service有一个线程会每秒扫描一次ReleaseMessage表
- 看看是否有新的消息记录
- 源码:
- 消息扫描类:ReleaseMessageScanner
- https://github.com/ctripcorp/apollo/blob/master/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/message/ReleaseMessageScanner.java
-
Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器
1.- 然后调用消息监听类的handleMessage方法: NotificationControllerV2
- https://github.com/ctripcorp/apollo/blob/master/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/NotificationControllerV2.java
- 然后调用消息监听类的handleMessage方法: NotificationControllerV2
-
NotificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端
Config Service通知客户端
上面描述了NotificationControllerV2是如何得知有配置发布的
NotificationControllerV2在得知有配置发布通知到客户端:
- 客户端会发起一个Http请求到Config Service的 notifications/v2 接口 NotificationControllerV2
客户端发送请求类:RemoteConfigLongPollService
- NotificationControllerV2不会立即返回结果,而是把请求挂起。
- 考虑到会有数万客户端向服务端发起长连接, 因此在服务端使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。
- 如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端。
- 如果有该客户端关心的配置发布
- NotificationControllerV2会调用DeferredResult的setResult方法
- 传入有 配置变化的namespace信息,同时该请求会立即返回。
- 客户端从返回的结果中获取到配置变化的namespace 后,会立即请求Config Service获取该namespace的最新配置。
客户端读取设计
除了之前介绍的客户端和服务端保持一个长连接,从而能第一时间获得配置更新的推送外,客户端还会定时从
Apollo配置中心服务端拉取应用的最新配置。
- 这是一个备用机制,为了防止推送机制失效导致配置不更新
- 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
- 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property:apollo.refreshInterval 来覆盖,单位为分钟
相关文章:
Apollo介绍和入门
文章目录 Apollo介绍配置中心介绍apollo介绍主流配置中心功能特性对比 Apollo简介 入门简单的执行流程Apollo具体的执行流程Apollo对象执行流程分步执行流程 核心概念应用,环境,集群,命名空间企业部署方案灰度发布全量发布 配置发布的原理发送…...
一文看懂Oracle 19c OCM认证考试(需要Oracle OCP证书)
Oracle OCM的认证全称是Oracle Certified Master,是比OCP更高一级的认证,姚远老师的很多OCP学员都对OCM考试有兴趣,这里跟大家做个介绍。 OCM考试全部是上机的实操考试,没有笔试,要到Oracle原厂参加两天的考试。参加1…...
回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图)效果一览…...
python自学
自学第一步 第一个简单的基础,向世界说你好 启动python 开始 print是打印输出的意思,就是输出引号内的内容。 标点符号必须要是英文的,因为他只认识英文的标点符号。 exit()推出python。 我们创建一个文本文档&…...
元宇宙安全与著作权相关市场与技术动态:韩国视角
元宇宙市场动态 元宇宙安全与著作权维护技术现状 元宇宙有可能为商业创造巨大价值,尤其是在零售和时尚领域。时尚产品的象征性价值不仅在物理空间中得以保持,在虚拟空间中也是如此。通过元宇宙平台,企业可以开发虚拟产品,降低供…...
springboot整合neo4j--采用Neo4jClient和Neo4jTemplate方式
1.背景 看了spring-boot-starter-data-neo4j的源码之后发现,该starter内已经实现了Neo4jClient和Neo4jTemplate,我们只需要使用Autowire就能直接使用它操作neo4j。 Neo4jClient方式与我的另一篇springboot整合neo4j-使用原生cypher Java API博客方式一样…...
【算法与数据结构】701、LeetCode二叉搜索树中的插入操作
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题关键在于分析插入值的位置,不论插入的值是什么(插入值和原有树中的键值都…...
前端--HTML
文章目录 HTML结构快速生成代码框架HTML常见标签 表格标签 编写简历信息 填写简历信息 Emmet 快捷键 HTML 特殊字符 一、HTML结构 1.认识HTML标签 HTML 代码是由 "标签" 构成的. 形如: <body>hello</body> 标签名 (body) 放到 < > 中 大部分标…...
安装配置 zookeeper(单机版)
目录 一 准备并解压安装包 二 修改zoo.cfg文件 三 创建相应两个目录 四 创建文件myid 五 修改环境变量 六 启动 zookeeper 一 准备并解压安装包 这里提供了网盘资源 http://链接: https://pan.baidu.com/s/1BybwSQ_tQUL23OI6AWxwFw?pwdd4cf 提取码: d4cf 这里的安装包是…...
2023/9/7 -- C++/QT
作业 1> 思维导图 2> 封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数, 提供一个公有成员函数,void setNum(int num)用于设置学生个数 提供一个…...
2023年09月IDE流行度最新排名
点击查看最新IDE流行度最新排名(每月更新) 2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多,这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…...
MyBatis基础之概念简介
文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发,MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…...
解决 SQLyog 连接 MySQL8.0+ 报错:错误号码2058
文章目录 一、问题现象二、原因分析三、解决方案1. 方案1:更新SQLyog版本2. 方案2:修改用户的授权插件3. 方案3:修复my.cnf 或 my.ini配置文件 四、最后总结 本文将总结如何解决 SQLyog 连接 MySQL8.0 时报错:错误号码2058 一、问…...
Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)
目录 1. drm_mode_addfb2 2. drm_internal_framebuffer_create 3. drm_fb_cma_create->drm_gem_fb_create->drm_gem_fb_create_with_funcs 4. drm_gem_fb_alloc 4.1 drm_helper_mode_fill_fb_struct 4.2 drm_framebuffer_init 5. 调用流程图 书接上回,使…...
mysql的date_format()函数格式月份的坑
问题背景 我表中有个字段存的是“年-月”格式的字符串,格式是这样的:‘2023-08’ 在查询这个表数据时,我使用了如下sql语句: select * from car where date_format(car_start_month,%Y-%m)<2023-08 意思是查询 car_start_mo…...
保姆级式教程:教你制作电子画册
在这个数字化时代,电子画册成为了展示和分享作品的一种流行方式。制作一个精美的电子画册不仅可以展示你的创意和才华,还可以吸引更多人的关注和欣赏。下面告诉大家一些小步骤,带你一步步学习如何制作电子画册。 1.收集和整理作品 接下来&am…...
探究Nginx应用场景
1 静态资源 Nginx是一个流行的Web服务器和反向代理服务器,它可以用于托管静态资源。下面是一个简单的案例,展示了如何使用Nginx来提供静态资源。 假设你有一个名为example.com的域名,并且你希望使用Nginx来托管位于/var/www/html目录下的静…...
sklearn中的数据集使用
导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集:{iris}) print(f查看数据集的特征:{iris.feature_names}) print(f查看数据集的标签:{iris.target_names}) print(f查看数据集的描述…...
LLM在电商推荐系统的探索与实践
本文对LLM推荐的结合范式进行了梳理和讨论,并尝试将LLM涌现的能力迁移应用在推荐系统之中,利用LLM的通用知识来辅助推荐,改善推荐效果和用户体验。 背景 电商推荐系统(Recommend System,RecSys)是一种基于用…...
Linux 文本操作指令
Linux操作系统提供了许多用于处理文本文件的命令和工具。以下是一些常用的Linux文本命令: cat: 用于查看文本文件的内容,也可以用于合并多个文件。 cat 文件名more和less: 用于逐页查看文本文件,特别是对于大型文件。 …...
GIS地图服务数据可视化
GIS地图服务数据可视化 OSM(Open Street Map,开放街道地图)Bing地图(必应地图)Google地图(谷歌地图) 地图服务数据可视化是根据调用的地图服务请求Web服务器端的地图数据,实现地图数…...
java 获取实体类的反射 Field用法(获取对象的字段名和属性值) 包含注解值 - 如何用枚举类映射获取数据库字段名
实体类映射数据库字段的设计思路 初始思路: 使用 java 的反射 Field 通过注解方法获取实体类属性的注解值,但是如果遇到不是标准的数据库映射的注解方法,那么就无法拿到对应的数据库映射字段名,所以这一点被笔者舍弃了。 什么是标准的映射注解方法,即导入方法后带 anno…...
日志平台搭建第六章:logstash通过kafka通道采集日志信息
1.修改文件/opt/app/elk/logstash-7.5.1/config.d/config1.conf,在input下添加kafka采集配置 #192.168.128.130:9103:kafka地址 #topics:主题 kafka {bootstrap_servers > ["192.168.128.130:9103"]group_id > "logstash"topics > [&…...
mysql的索引分类
索引分类 在 MySQL 数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。 分类 含义 特点 关键字 主键 索引 针对于表中主键创建的索引 默认自动创建 , 只能 有一个 PRIMARY 唯一 索引 避免同一个表中某数据列中…...
【校招VIP】java语言考点之并发相关
考点介绍: 并发在操作系统中是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。并发相关问题在校招面试中出现频次很高。 java语言考点之并发相…...
nginx实现路由重定向功能 避免服务器出现 404 Not Found
首先 到服务器上 vue react等项目路由的重定向已解决不了带后缀的访问 这个重定向需要 nginx 来实现 我们先执行 scp -r 用户名 如果没设置过就是root服务器公网地址:/etc/nginx/nginx.conf E:/拷贝地址这里 我将服务器上的nginx配置文件 拷贝到了本地的 E盘下的 拷贝地址目录…...
Flask+pyecharts+SQLAlchemy,统计图的数据存放在mysql中,综合版
ISEE小语 有人问:“世上最廉价的东西是什么?” 在网上看到这样一个回答说: “大概就是付出吧,一贫如洗的真心、一事无成的温柔、一厢情愿的等待。” 回顾上篇 此篇是在【Flask+pyecharts结合,html统计图呈现在前端页面】和【Flask+pyecharts结合,优化前端加导航栏显示】的…...
SQL注入类型判断
SQL注入的类型分为字符型和数字型,以sqli-labs靶场1、2关为例: 第一关 第一关注入一个1’,错误回显出下面内容,其中1’是注入的内容,0,1后面的单引号和最前面的单引号是一对,剩下的两个单引号是一对&#…...
ElasticSearch的安装部署-----图文介绍
文章目录 背景什么是ElasticSearch使用场景 ElasticSearch的在linux环境下的安装部署前期准备分配权限(正式实操)启动ElasticSearch创建用户组创建用户,并设置密码用户添加到elasticsearch用户组指定用户操作目录的一个操作权限切换用户 解压elasticsearch修改es的配…...
Unity粒子系统ParticleSystem各模块及其参数学习
粒子系统控制面板默认有4个模块:Particle System(主模块),Emission(发射模块), Shape(形状模块),Renderer(渲染器模块) 1.Particle …...
医疗网站模板/竞价推广的企业
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://beanxyz.blog.51cto.com/5570417/1602424 这一节和老师学习了SELinux的基本知识。 SELinux的全称是Security Enhanced Linux, 直译就是安…...
商业网站建设政策支持/网站关键词优化wang
为了加速CoreData搜索。需要索引。 根据我的经验,速度的提高从 3 秒到 100,000 件中的 0.3 秒快了 10 倍。 不幸的是,Apple 没有关于使用 CoreData 建立索引的文档,而且 WWDC 教程也没有这方面的信息。 首先进行一些简单的设置: 在 .xcdatamodeld 文件的编辑器中长按“添…...
网站备案申请模板/网站友情链接美化代码
1.安装查看:http://ifeve.com/zookeeper-talk-quick-start/ 2.使用: Zookeeper是一个高性能的分布式应用协调服务的框架。ZookeeperZookeeper,中文直译是动物园的看守者。 Zookeeper可以用于解决很多分布式系统遇到的问题,比如分布式锁,分布式…...
wordpress标签字段/如何自己搭建一个网站
学生信息成绩管理系统采用Python qt5 来实现 快速获得整个项目的入口:https://download.csdn.net/download/nanxiang11/15179227 就可以获取整个项目资源 由于项目文件比较多所以我分了好几个包来完成这个项目如下图: 然后就是一些要安装的组件 其实…...
ppt可以做网站/北京网站制作公司
我是一名国家二级运动员,也是一名健身减脂教练,专注于减脂塑形。原问题是:停止减肥之后,每天吃的都超过基础热量,还不运动,体重却一直在掉,这是什么原因?已经瘦了好多,17…...
网站开发的目的意义/幽默软文经典案例300
题意:有一个n个点的无向完全图,找一条最短路(起点终点任意),使得该道路经过E条指定的边。 分析: 1、因为要使走过的路最短,所以每个指定的边最好只走一遍,所以是欧拉道路。 2、若当前…...