Apollo介绍和入门

news2025/1/12 21:35:22

文章目录

  • Apollo介绍
    • 配置中心介绍
    • apollo介绍
      • 主流配置中心
        • 功能特性对比
      • Apollo简介
  • 入门
    • 简单的执行流程
    • Apollo具体的执行流程
      • Apollo对象
      • 执行流程
      • 分步执行流程
  • 核心概念
    • 应用,环境,集群,命名空间
    • 企业部署方案
    • 灰度发布
      • 全量发布
    • 配置发布的原理
      • 发送ReleaseMessage
      • Config Service通知客户端
      • 客户端读取设计

Apollo介绍

配置中心介绍

  • 分布式系统环境下,给其他服务提供配置文件的管理,统一管理各种应用配置的一个基础服务组件

img

apollo介绍

Apollo(阿波罗)是携程开源的一款可靠的分布式配置管理中心,它能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景

主流配置中心

目前市面上用的比较多的配置中心有:

  1. Spring Cloud Config
    1. 2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
    2. GitHub地址
      1. https://github.com/spring-cloud/spring-cloud-config
  2. Nacos
    1. 2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。
    2. GitHub地址
      1. https://github.com/alibaba/nacos
  3. Apollo
    1. 2016年5月,携程开源的配置管理中心
    2. 能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端
    3. 并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
    4. GitHub地址
      1. https://github.com/apolloconfig

功能特性对比

功能点Spring Cloud ConfigApolloNacos
配置实时推送支持支持(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配置中心修改或发布配置后,会有两种机制来保证应用程序来获取最新配置:

  1. 一种是Apollo配置中心会向客户端推送最新的配置;
  2. 另外一种是Apollo客户端会定时从Apollo配置中心拉取最新的配置

通过以上两种 机制共同来保证应用程序能及时获取到配置。

Apollo具体的执行流程

img

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进程 中

分步执行流程

  1. Apollo启动后
    1. Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳
  2. Apollo Client和Portal管理端通过配置的Meta Server的域名地址
    1. 经由Software Load Balancer**(软件负载均衡** **器)进行负载均衡后分配到某一个Meta** Server
  3. Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
  4. Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试
    1. 获取到正确的Config Service和Admin Service的服务信息后
    2. Apollo Client通过Config Service为应用提供配置获取、实时更新等功能;
    3. Apollo Portal管理端通过Admin Service提供配置新增、修改、发布等功能

核心概念

应用,环境,集群,命名空间

  • 应用

    • 就是实际使用配置的应用
      • Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
    • 关键字: appId
  • 环境

    • 配置对应的环境
      • Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
    • 关键字: env
  • 集群

    • 一个应用下不同实例的分组
    • 比如典型的可以按照数据中心分
      • 把上海机房的应用实例分为一个集群
      • 把北京机房的应用实例分为另一个集群。
    • 关键字:cluster
  • 关系

    • 应用 --> 环境 --> 集群
      • 应用 : 工程项目
      • 应用分环境
        • 具体环境下边
          • 由于部署的集群不同,导致配置的不同
            • 北京和上海数据库的地址不同,虽然都是生产环境
  • 命名空间

    • img

    • 一个应用下不同配置的分组

      • 配置通过key,value 存储
  • 通过namespace对我们的配置项进行分类管理

    • 不同类型的配置存放在不同的文件中
      • 数据库配置文件,RPC配置文件,应用自身的配置文件
    • 在添加配置的时候,要记得对配置项进行分类
    • img
  • 公共和私有:

    • img

    • 有共用的情况,公共命名空间可以继承

      • 有5个工程都会连接数据库,数据库的配置就共用了
      • 就可以建一个公共的命名空间(例如数据库的连接)
        • 生产环境里面的命名空间可以继承公共的命名空间
        • 生产环境就可以直接拿到数据库的连接
          • 可以在生产环境中再做个性化定义

企业部署方案

在企业中常用的部署方案为:

  • Apollo-adminservice (发布配置)和Apollo-configservice (查询配置)两个服务
    • 分别在线上环境(pro),仿真环 境(uat)和开发环境(dev)各部署一套
    • 并且还要建立不同的 apolloconfigdb
      • 因为配置信息在不同的数据库当中
  • Apollo-portal做为管理端
    • 管理界面,只部署一套
      • 统一管理上述三套环境。
    • 通过一个portal管理界面,连接访问不同的生产环境

具体如下图所示:

img

灰度发布

  • 定义:
    • 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。
    • 在其上可以进行A/B testing
      • 即让一部分用户继续用 产品特性A
      • 一部分用户开始用产品特性B
      • 如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁 移到B上面来。
  • Apollo实现的功能
    • 对于一些对程序有比较大影响的配置
      1. 可以先在一个或者多个实例生效观察一段时间没问题后再全量发布 配置
    • 对于一些需要调优的配置参数
      1. 可以通过灰度发布功能来实现A/B测试。
      2. 可以在不同的机器上应用不同的配 置,不断调整、测评一段时间后找出较优的配置再全量发布配置。

全量发布

  • 灰度发布测试完成后,全量发布

配置发布的原理

  • 参考链接
    • https://www.iocoder.cn/categories/Apollo/
    • img
  1. 用户在Portal操作配置发布
  2. Portal调用Admin Service的接口操作发布
  3. Admin Service发布配置后,发送ReleaseMessage给各个Config Service
  4. Config Service收到ReleaseMessage后,通知对应的客户端

发送ReleaseMessage

  • 通过数据库实现了一个简单的消息队列

具体实现方式如下:

  1. Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录

    1. 消息内容就是配置发布的AppId****+Cluster+Namespace
    2. 源码:
      1. 消息发送类: DatabaseMessageSende
      2. https://github.com/ctripcorp/apollo/blob/master/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/message/DatabaseMessageSender.java
  2. Config Service有一个线程会每秒扫描一次ReleaseMessage表

    1. 看看是否有新的消息记录
    2. 源码:
      1. 消息扫描类:ReleaseMessageScanner
      2. https://github.com/ctripcorp/apollo/blob/master/apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/message/ReleaseMessageScanner.java
  3. Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器
    1.

    1. 然后调用消息监听类的handleMessage方法: NotificationControllerV2
      • https://github.com/ctripcorp/apollo/blob/master/apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/NotificationControllerV2.java
  4. NotificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端

img

Config Service通知客户端

上面描述了NotificationControllerV2是如何得知有配置发布的

NotificationControllerV2在得知有配置发布通知到客户端:

  1. 客户端会发起一个Http请求到Config Service的 notifications/v2 接口 NotificationControllerV2

客户端发送请求类:RemoteConfigLongPollService

  1. NotificationControllerV2不会立即返回结果,而是把请求挂起。
  2. 考虑到会有数万客户端向服务端发起长连接, 因此在服务端使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。
    1. 如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端。
    2. 如果有该客户端关心的配置发布
      1. NotificationControllerV2会调用DeferredResult的setResult方法
      2. 传入有 配置变化的namespace信息,同时该请求会立即返回。
      3. 客户端从返回的结果中获取到配置变化的namespace 后,会立即请求Config Service获取该namespace的最新配置。

客户端读取设计

除了之前介绍的客户端和服务端保持一个长连接,从而能第一时间获得配置更新的推送外,客户端还会定时从

Apollo配置中心服务端拉取应用的最新配置。

  • 这是一个备用机制,为了防止推送机制失效导致配置不更新
  • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
  • 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property:apollo.refreshInterval 来覆盖,单位为分钟

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

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

相关文章

MyBatis基础之概念简介

文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发,MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…

无涯教程-JavaScript - ISODD函数

描述 如果数字为奇数,则ISODD函数返回TRUE,如果数字为偶数,则返回FALSE。 语法 ISODD (number) 争论 Argument描述Required/OptionalNumber 要测试的值或表达式。 如果number不是整数,则将其截断。 Required Notes 您可以在执行计算之前使用此功能测试单元格的内容。 如果…

微服务 第一章 Java线程池技术应用

系列文章目录 第一章 Java线程池技术应用 文章目录 系列文章目录[TOC](文章目录) 前言1、Java创建线程方式回顾1.1、继承Thread类(只运行一次)1.1.1、改造成主线程常驻,每秒开启新线程运行1.1.2、匿名内部类1.1.3、缺点1.1.4、扩展知识:Java内部类1.1.4…

Python 内置函数详解 (2) 逻辑运算

近期在外旅游,本篇是出发编辑的,准备定时发布用,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客https://blog.csdn.net/boysoft2002/article/detai…

SOLIDWORKS PDM—数据库的备份计划

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据,并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional,您的团队能够:1. 安全地存储和索引设计数据以实现快速检索;2. 打消关于…

Linux——进程间通信(管道及共享内存)

目录 0. 前言 1. 进程通信的目的 2. 进程通信发展及分类 3. 进程通信匿名管道 3.1 什么是管道? 3.2 匿名管道系统调用 3.3 fork后子进程继承(基于内存级) 3.4 站在文件描述符角度-深度理解管道 3.5 站在内核角度-管道本质 3.6 父子…

电动车彻底取代燃油车?瑞士限制,中国每天烧7辆,现实不乐观

随着新能源汽车在国内汽车市场的销量占比突破三成,业界对于电动汽车取代燃油车相当乐观,然而电动汽车存在的不少问题却不容忽视,这正逐渐成为电动汽车普及的巨大障碍。 电动汽车如今面临的问题不少,最让消费者吐槽的是充电问题&am…

python自学

自学第一步 第一个简单的基础,向世界说你好 启动python 开始 print是打印输出的意思,就是输出引号内的内容。 标点符号必须要是英文的,因为他只认识英文的标点符号。 exit()推出python。 我们创建一个文本文档&…

删除数组中的重复项——双指针

双指针法&#xff0c;说是双指针其实就是在一个数组中定义两个数组下标变量&#xff0c;通过两个下标的移动和赋值来实现 代码&#xff1a; int removeDuplicates(int* nums, int numsSize){int left1; int right1; while(left<numsSize) {if(nums[left]!nums[left-1]){num…

耐蚀合金连续油管最新版 学习记录

声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了耐蚀合金连续油管的订货、材料、制造、检验试验、标记等。 本文件适用于油气井用耐蚀合金连续油管(以下简称"油管")…

2023备战秋招Java面试八股文合集

Java就业大环境仍然根基稳定&#xff0c;市场上有很多机会&#xff0c;技术好的人前景就好&#xff0c;就看你有多大本事了。小编得到了一份很不错的资源&#xff0c;建议大家可以认真地来看看以下的资料&#xff0c;来提升一下自己的核心竞争力&#xff0c;在面试中轻松应对面…

易基因: MeRIP-seq等揭示组蛋白乙酰化和m6A修饰在眼部黑色素瘤发生中的互作调控|肿瘤研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 组蛋白去乙酰化抑制剂(HDACis)在多种恶性肿瘤中显示出令人鼓舞的结果。N6-甲基腺嘌呤(m6A)是最普遍的mRNA修饰&#xff0c;在肿瘤发生调控中起重要作用。然而&#xff0c;对组蛋白乙酰化…

美国海运价格,美国专线直达怎么收费?

美国海运价格是根据多个因素来确定的&#xff0c;包括货物的重量、体积、目的地、起运港口和目的港口之间的距离、运输方式(整箱或拼箱)以及货物的特殊要求等。以下是一些常见的影响美国海运价格的因素&#xff1a; 一、货物重量和体积&#xff1a; 货物的重量和体积是计算海运…

esxi扩容磁盘

esxi扩容磁盘 fdisk -l没用扩容 登录Esxi管理界面扩容磁盘 进入服务器查看 没用变化 &#xff08;有些可能进去磁盘就是更新&#xff0c;直接就是扩容的&#xff0c;但是没扩容就需要执行下面的命令&#xff09; [root234-ces /]# fdisk -l Disk /dev/sda: 85.9 GB, 858993…

uniapp 轮播列表左右滑动,滑动到中间放大

html <!-- 轮播 --><view class"heade"><swiper class"swiper" display-multiple-items3 circulartrue previous-margin1rpxnext-margin1rpx current0 change"swiperChange" ><block v-for"(item,index) in list"…

武汉便宜的ov通配符https证书

通配符https证书是一种特殊的数字证书&#xff0c;可以用于保护单个域名的所有一级子域名。这意味着&#xff0c;使用单个通配符证书&#xff0c;您可以保护主域名及其所有一级子域名的安全&#xff0c;而无需为每个子域名购买独立的证书。 而通配符https证书中的OV企业型证书能…

投放ASA广告的注意事项

ASA展示位置已不仅仅局限于传统的搜索结果&#xff0c;还包括“today”选项卡、“搜索”选项卡和单个应用产品页面上的广告。ASA的最终目标是帮助我们的应用程序呈现给更多用户并增加下载量。虽然创建和运行Apple Search Ads广告系列看似简单&#xff0c;但细节决定成败。 1、…

【面试小姿势】数据库设计的三大范式及其应用

前言&#xff1a; 今天和大家探讨一道最近的面试题&#xff0c;面试回答描述的不是很清楚&#xff0c;所以在此记录一下。本篇文章主要讲解Java类加载机制的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff…

扩展pytest接口自动化框架-MS数据解析功能

开篇 MeterSphere的数据源通过html页面上传后&#xff0c;需要将请求方式进行拆分。 get接口的参数&#xff0c;常以params的方式进行传参&#xff0c;也就是在url后带上参数。 post接口一般是以json字符串的形式传参&#xff0c;也有params方式进行传参的。而在MeterSphere里…

三方检测-渗透测试问题及问题处理

文章目录 省流具体问题信息遍历【高风险】描述举例解决方案 任意文件上传【高风险】描述解决方案 邮箱验证码等轰炸【中风险】描述解决方案 用户名轰炸【高风险】描述解决方案 错误信息返回敏感信息【高风险】描述举例解决方案 明文传输漏洞【高风险】描述举例解决方案 点击劫持…