Apollo原理分析及功能详解(配置管理、集群管理等)

导读:本篇文章讲解 Apollo原理分析及功能详解(配置管理、集群管理等),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

官方文档:https://www.apolloconfig.com/#/zh/README

1. Apollo工作原理

下图是Apollo架构模块的概览:

image-20220101151226786

1.1 各模块职责

上图简要描述了Apollo的总体设计,我们可以从下往上看:

  • Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端

  • Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)

  • Eureka提供服务注册和发现,为了简单起见,目前Eureka在部署时和Config Service是在一个JVM进程中

  • Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳

  • 在Eureka之上架了一层Meta Server用于封装Eureka的服务发现接口

  • Client通过域名访问Meta Server获取Confifig Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试

  • Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试

  • 为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中

1.2 分步执行流程

  1. Apollo启动后,Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。

  2. Apollo Client和Portal管理端通过配置的Meta Server的域名地址经由Software Load Balancer(软件负载均衡器)进行负载均衡后分配到某一个Meta Server

  3. Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client

  4. Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试

  5. 获取到正确的Config Service和Admin Service的服务信息后,Apollo Client通过Config Service为应用提供配置获取、实时更新等功能;Apollo Portal管理端通过Admin Service提供配置新增、修改、发布等功能

2. 核心概念

  1. application (应用)

    这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置

    关键字:appId

  2. environment (环境)

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

    关键字:env

  3. cluster (集群)

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

    关键字:cluster

  4. namespace (命名空间)

    一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等

    关键字:namespaces

它们的关系如下图所示:

image-20220101152425486

3. 项目管理

3.1 基础设置

  1. 部门管理

    apollo 默认部门有两个。要增加自己的部门,可在系统参数中修改:

    • 进入系统参数设置

      image-20220101152550894

    • 输入key查询已存在的部门设置:organizations

      image-20220101152648069

    • 修改value值来添加新部门,下面添加一个微服务部门:

      [{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"},{"orgId":"micro_service","orgName":"微服务部门"}]
      
  2. 添加用户

    apollo默认提供一个超级管理员: apollo,可以自行添加用户。

    • 新建用户张三

      image-20220101152811464

      image-20220101152847345

3.2 创建项目

  1. 打开apollo-portal主页:http://localhost:8070/

  2. 点击“创建项目”:account-service

    image-20220101153001161

  3. 输入项目信息

部门:选择应用所在的部门

应用AppId:用来标识应用身份的唯一id,格式为string,需要和项目配置文件applications.properties 中配置的app.id对应

应用名称:应用名,仅用于界面展示

应用负责人:选择的人默认会成为该项目的管理员,具备项目权限管理、集群创建、Namespace创建等 权限

image-20220101153116062

  1. 点击提交

    创建成功后,会自动跳转到项目首页

image-20220101153149259

  1. 赋予之前添加的用户张三管理account-service服务的权限

    • 使用管理员apollo将指定项目授权给用户张三

      image-20220101153221648

    • 将修改和发布权限都授权给张三

      image-20220101153411052

    • 使用zhangsan登录,查看项目配置

      image-20220101153633032

    • 点击account-service即可管理配置

3.3 删除项目

如果要删除整个项目,点击右上角的“管理员工具–》删除应用、集群…”

首先查询出要删除的项目,点击删除应用.

image-20220101153817368

4. 配置管理

下边在account-service项目中进行配置。

4.1 添加发布配置项

  1. 通过表格模式添加配置

    • 点击新增配置

      image-20220101153934082

    • 输入配置项:sms.enable,点击提交

      image-20220101154010389

  2. 通过文本模式编辑

    Apollo除了支持表格模式,逐个添加、修改配置外,还提供文本模式批量添加、修改。 这个对于从已有的properties文件迁移尤其有用。

    • 切换到文本模式

      image-20220101154109951

    • 输入配置项,并点击提交修改

      image-20220101154142264

  3. 发布配置

    image-20220101154203054

4.2 修改配置

  1. 找到对应的配置项,点击修改

image-20220101154252535

  1. 修改为需要的值,点击提交

  2. 发布配置

4.3 删除配置

  1. 找到需要删除的配置项,点击删除

image-20220101154345646

  1. 确认删除后,点击发布

image-20220101154501089

4.4 添加Namespace

Namespace作为配置的分类,可当成一个配置文件。

以添加rocketmq配置为例,添加“spring-rocketmq” Namespace配置rocketmq相关信息。

  1. 添加项目私有Namespace:spring-rocketmq

    进入项目首页,点击左下脚的“添加Namespace”,共包括两项:关联公共Namespace和创建Namespace,这里选择 创建Namespace

image-20220101154654620

  1. 添加配置项

    rocketmq.name‐server = 127.0.0.1:9876 
    rocketmq.producer.group = PID_ACCOUNT
    

image-20220101154749812

  1. 发布配置

image-20220101154828387

4.5 公共配置

4.5.1 添加公共Namespace

在项目开发中,有一些配置可能是通用的,我们可以通过把这些通用的配置放到公共的Namespace中,这样其他项目要使用时可以直接添加需要的Namespace。

  1. 新建common-template项目

    image-20220101155036296

  2. 添加公共Namespace:spring-boot-http

    进入common-template项目管理页面添加命名空间

image-20220101155157205

  1. 添加配置项并发布

    spring.http.encoding.enabled = true 
    spring.http.encoding.charset = UTF‐8 
    spring.http.encoding.force = true 
    server.tomcat.remote_ip_header = x‐forwarded‐for 
    server.tomcat.protocol_header = x‐forwarded‐proto 
    server.use‐forward‐headers = true
    server.servlet.context‐path = /
    

    image-20220101155321961

4.5.2 关联公共Namespace

  1. 打开之前创建的account-service项目

  2. 点击左侧的添加Namespace

  3. 添加Namespace

image-20220101155513086

  1. 根据需求可以覆盖引入公共Namespace中的配置,下面以覆盖server.servlet.context-path为例

image-20220101155655282

image-20220101155823894

  1. 修改server.servlet.context-path为:/account-service

image-20220101155905007

  1. 发布修改的配置项

image-20220101155925928

5. 多项目配置

通常一个分布式系统包括多个项目,所以需要多个项目,下边以一个P2P金融的项目为例,添加交易中心微服务transaction-service。

  1. 添加交易中心微服务transaction-service

image-20220101160030055

  1. 关联公共Namespace

    任务应用都可以关联公共Namespace。

image-20220101160104017

  1. 覆盖配置,修改交易中心微服务的context-path为:/transaction
  2. 发布修改后的配置

6. 集群管理

在有些情况下,应用有需求对不同的集群做不同的配置,比如部署在A机房的应用连接的RocketMQ服务器地址和部署在B机房的应用连接的RocketMQ服务器地址不一样。另外在项目开发过程中,也可为不同的开发人员创建不同的集群来满足开发人员的自定义配置。

6.1 创建集群

  1. 点击页面左侧的“添加集群”按钮

image-20220101160940025

image-20220101161046128

  1. 切换到对应的集群,修改配置并发布即可

image-20220101161116803

6.2 同步集群配置

同步集群的配置是指在同一个应用中拷贝某个环境下的集群的配置到目标环境下的目标集群。

  1. 从其他集群同步已有配置到新集群

    • 切换到原有集群

    • 展开要同步的Namespace,点击同步配置

      image-20220101161441547

    • 选择同步到的新集群,再选择要同步的配置

      image-20220101161613565

    • 同步完成后,切换到SHAJQ集群,发布配置

      image-20220101161638718

6.3 读取配置

读取某个集群的配置,需要启动应用时指定具体的应用、环境和集群。

-Dapp.id=应用名称

-Denv=环境名称

-Dapollo.cluster=集群名称

-D环境_meta=meta地址

‐Dapp.id=account‐service 
‐Denv=DEV 
‐Dapollo.cluster=SHAJQ 
‐Dapollo.meta=http://localhost:8080

7. 配置发布原理

在配置中心中,一个重要的功能就是配置发布后实时推送到客户端。下面我们简要看一下这块是怎么设计实现的。

image-20220101161838466

上图简要描述了配置发布的主要过程:

  1. 用户在Portal操作配置发布

  2. Portal调用Admin Service的接口操作发布

  3. Admin Service发布配置后,发送ReleaseMessage给各个Config Service

  4. Config Service收到ReleaseMessage后,通知对应的客户端

7.1 发送ReleaseMessage

Admin Service在配置发布后,需要通知所有的Config Service有配置发布,从而Config Service可以通知对应的客户端来拉取最新的配置。

从概念上来看,这是一个典型的消息使用场景,Admin Service作为producer(生产者)发出消息,各个Config Service作为consumer(消费者)消费消息。通过一个消息队列组件(Message Queue)就能很好的实现Admin Service和Config Service的解耦。

在实现上,考虑到Apollo的实际使用场景,以及为了尽可能减少外部依赖,我们没有采用外部的消息中间件,而是通过数据库实现了一个简单的消息队列。相关代码直接下载源码查看即可。

具体实现方式如下:

  1. Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录,消息内容就是配置发布的AppId+Cluster+Namespace

    SELECT * FROM ApolloConfigDB.ReleaseMessage
    

    image-20220101162310967

    消息发送类:DatabaseMessageSende

image-20220101162412149

  1. Config Service有一个线程会每秒扫描一次ReleaseMessage表,看看是否有新的消息记录。

    消息扫描类:ReleaseMessageScanner

image-20220101162537097

  1. Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器

image-20220101162607253

  1. NotifificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端

image-20220101162713639

7.2 Config Service 通知客户端

上文中简要描述了NotificationControllerV2是如何得知有配置发布的,那NotificationControllerV2在得知有配置发布后是如何通知到客户端的呢?

实现方式如下:

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

image-20220101162923641

  1. NotificationControllerV2不会立即返回结果,而是把请求挂起。考虑到会有数万客户端向服务端发起长连,因此在服务端使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。

  2. 如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端。

  3. 如果有该客户端关心的配置发布,NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回。客户端从返回的结果中获取到配置变化的namespace 后,会立即请求Config Service获取该namespace的最新配置。

7.3 客户端读取设计

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16743.html

(0)
小半的头像小半
0 0

相关推荐

  • SpringCloud入门(3)OpenFeign 后端开发

    SpringCloud入门(3)OpenFeign

    0 098
    小半的头像 小半
    2022年7月5日
  • 认识线程、Java多线程编程、Thread类及常见方法 后端开发

    认识线程、Java多线程编程、Thread类及常见方法

    0 0109
    小半的头像 小半
    2023年2月6日
  • SpringBoot – activeMQ 消息队列 后端开发

    SpringBoot – activeMQ 消息队列

    0 0132
    小半的头像 小半
    2022年5月18日
  • 二十四.SpringCloudConfig源码-配置拉取流程 后端开发

    二十四.SpringCloudConfig源码-配置拉取流程

    0 0111
    小半的头像 小半
    2022年5月19日
  • OAuth2结合JWT 后端开发

    OAuth2结合JWT

    0 0126
    小半的头像 小半
    2022年5月28日
  • CSS的引入方式 Python

    CSS的引入方式

    0 0163
    飞熊的头像 飞熊
    2023年3月5日
  • 5款最受欢迎Python GUI库重磅比较:发现最适合你的开发工具 Python

    5款最受欢迎Python GUI库重磅比较:发现最适合你的开发工具

    0 095
    小白这样学Python的头像 小白这样学Python
    2024年4月1日
  • Android获取验证码时的计时器 Android

    Android获取验证码时的计时器

    0 0123
    seven_的头像 seven_
    2023年2月27日
  • 10 微服务架构下网关的技术选型及网关必备特征 后端开发

    10 微服务架构下网关的技术选型及网关必备特征

    0 0129
    小半的头像 小半
    2022年5月19日
  • 【Flask项目2】登录接口的开发(12) Python

    【Flask项目2】登录接口的开发(12)

    0 0105
    飞熊的头像 飞熊
    2023年3月5日
  • Android gradle 项目怎么配置抽取合并? Android

    Android gradle 项目怎么配置抽取合并?

    0 0154
    seven_的头像 seven_
    2023年2月26日
  • Day31面向对象之魔法方法 Python

    Day31面向对象之魔法方法

    0 0115
    小半的头像 小半
    2023年1月6日

站长精选

  • 谷歌中国大裁员赔偿 N+9?不,结果比这更离谱。。。

    谷歌中国大裁员赔偿 N+9?不,结果比这更离谱。。。

    2023年3月13日

  • Dubbo-聊聊注册中心的设计

    Dubbo-聊聊注册中心的设计

    2022年11月21日

  • 一个小公司的技术开发心酸事(已倒闭)

    一个小公司的技术开发心酸事(已倒闭)

    2024年3月16日

  • Redis 和 SpringBoot 的绝佳组合:Lua 脚本的黑科技!

    Redis 和 SpringBoot 的绝佳组合:Lua 脚本的黑科技!

    2023年10月15日

  • Spring事务畅谈:深入讨论一下 @Transactional 注解

    Spring事务畅谈:深入讨论一下 @Transactional 注解

    2023年9月17日

  • 阿里开源!又一个序列化框架来了,性能炸裂!

    阿里开源!又一个序列化框架来了,性能炸裂!

    2023年8月1日

  • 仅需一个注解,实现 SpringBoot 项目中的隐私数据脱敏!

    仅需一个注解,实现 SpringBoot 项目中的隐私数据脱敏!

    2023年1月4日

  • K8s留给我们一地鸡毛!

    K8s留给我们一地鸡毛!

    2023年10月15日

  • SQL最消耗性能查询的10种错误用法,想要性能变差这么做就对了!

    SQL最消耗性能查询的10种错误用法,想要性能变差这么做就对了!

    2024年1月7日

  • 首次力压 macOS,Linux 桌面版在2022年杀疯了!

    首次力压 macOS,Linux 桌面版在2022年杀疯了!

    2023年1月22日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

PHP网站源码西乡网站改版坪地模板制作横岗网站搜索优化大芬企业网站建设惠州网站设计惠州百姓网标王南联百度爱采购平湖网站改版福永企业网站建设民治营销型网站建设横岗网站建设深圳网站制作设计塘坑企业网站建设深圳百度关键词包年推广平湖网站排名优化大鹏网站优化按天扣费荷坳seo网站推广光明网站推广方案福永企业网站改版永湖网站优化排名布吉网站开发光明关键词排名包年推广龙岗网站定制大浪网站搜索优化平湖优化西乡网站优化软件同乐企业网站改版坂田网站关键词优化布吉关键词排名包年推广大芬营销型网站建设歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化