】、、通过学习 Apollo 的架构,带你深入理解微服务架构的基本原理

一、介绍

Apollo(阿波罗)[参考附录] 是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

Apollo 目前在国内开发者社区比较热,在 Github 上有超过 5k 颗星,在国内众多互联网公司有落地案例,可以说 Apollo 是目前配置中心产品领域 Number1 的产品,其成熟度和企业级特性要远远强于 Spring Cloud 体系中的 Spring Cloud Config 产品。

Apollo 采用分布式微服务架构,它的架构有一点复杂,Apollo 的作者宋顺虽然给出了一个架构图,但是如果没有一定的分布式微服务架构基础的话,则普通的开发人员甚至是架构师也很难一下子理解。为了让大家更好的理解 Apollo 的架构设计,我花了一点时间把 Apollo 的架构按我的方式重新剖析一把。只有完全理解了 Apollo 的架构,大家才能在生产实践中更好的部署和使用 Apollo。另外,通过学习 Apollo 的架构,大家可以深入理解微服务架构的一些基本原理。

二、架构和模块

下图是 Apollo 的作者宋顺给出的架构图:


如果没有足够的分布式微服务架构的基础,对携程的一些框架产品 (比如 Software Load Balancer(SLB) 不了解的话,那么这个架构图第一眼看是不太好理解的 (其实我第一次看到这个架构也没有看明白)。在这里我们先放一下,等我后面把这个架构再重新剖析一把以后,大家再回过头来看这个架构就容易理解了。

下面是 Apollo 的七个模块,其中四个模块是和功能相关的核心模块,另外三个模块是辅助服务发现的模块:

四个核心模块及其主要功能

模块 主要功能
ConfigService 提供配置获取接口
提供配置推送接口
服务于Apollo客户端
AdminService 提供配置管理接口
提供配置修改发布接口
服务于管理界面Portal
Client 为应用获取配置,支持实时更新
通过MetaServer获取ConfigService的服务列表
使用客户端软负载SLB方式调用ConfigService
Portal 配置管理界面
通过MetaServer获取AdminService的服务列表
使用客户端软负载SLB方式调用AdminService

三个辅助服务发现模块

模块 主要功能
Eureka 用于服务发现和注册
Config/AdminService注册实例并定期报心跳
和ConfigService住在一起部署
MetaServer Portal通过域名访问MetaServer获取AdminService的地址列表
Client通过域名访问MetaServer获取ConfigService的地址列表
相当于一个Eureka Proxy
逻辑角色,和ConfigService住在一起部署
NginxLB 和域名系统配合,协助Portal访问MetaServer获取AdminService地址列表
和域名系统配合,协助Client访问MetaServer获取ConfigService地址列表
和域名系统配合,协助用户访问Portal进行配置管理

三、架构剖析

Apollo 架构 V1

如果不考虑分布式微服务架构中的服务发现问题,Apollo 的最简架构如下图所示:

要点:

  1. ConfigService 是一个独立的微服务,服务于 Client 进行配置获取。
  2. Client 和 ConfigService 保持长连接,通过一种拖拉结合 (push & pull) 的模式,实现配置实时更新的同时,保证配置更新不丢失。
  3. AdminService 是一个独立的微服务,服务于 Portal 进行配置管理。Portal 通过调用 AdminService 进行配置管理和发布。
  4. ConfigService 和 AdminService 共享 ConfigDB,ConfigDB 中存放项目在某个环境的配置信息。ConfigService/AdminService/ConfigDB 三者在每个环境 (DEV/FAT/UAT/PRO) 中都要部署一份。
  5. Portal 有一个独立的 PortalDB,存放用户权限、项目和配置的元数据信息。Portal 只需部署一份,它可以管理多套环境。

Apollo 架构 V2

为了保证高可用,ConfigService 和 AdminService 都是无状态以集群方式部署的,这个时候就存在一个服务发现问题:Client 怎么找到 ConfigService?Portal 怎么找到 AdminService?为了解决这个问题,Apollo 在其架构中引入了 Eureka 服务注册中心组件,实现微服务间的服务注册和发现,更新后的架构如下图所示:

要点:

  1. Config/AdminService 启动后都会注册到 Eureka 服务注册中心,并定期发送保活心跳。
  2. Eureka 采用集群方式部署,使用分布式一致性协议保证每个实例的状态最终一致。

Apollo 架构 V3

我们知道 Eureka 是自带服务发现的 Java 客户端的,如果 Apollo 只支持 Java 客户端接入,不支持其它语言客户端接入的话,那么 Client 和 Portal 只需要引入 Eureka 的 Java 客户端,就可以实现服务发现功能。发现目标服务后,通过客户端软负载 (SLB,例如 Ribbon) 就可以路由到目标服务实例。这是一个经典的微服务架构,基于 Eureka 实现服务注册发现 + 客户端 Ribbon 配合实现软路由,如下图所示:

Apollo 架构 V4

在携程,应用场景不仅有 Java,还有很多遗留的.Net 应用。Apollo 的作者也考虑到开源到社区以后,很多客户应用是非 Java 的。但是 Eureka(包括 Ribbon 软负载) 原生仅支持 Java 客户端,如果要为多语言开发 Eureka/Ribbon 客户端,这个工作量很大也不可控。为此,Apollo 的作者引入了 MetaServer 这个角色,它其实是一个 Eureka 的 Proxy,将 Eureka 的服务发现接口以更简单明确的 HTTP 接口的形式暴露出来,方便 Client/Protal 通过简单的 HTTPClient 就可以查询到 Config/AdminService 的地址列表。获取到服务实例地址列表之后,再以简单的客户端软负载 (Client SLB) 策略路由定位到目标实例,并发起调用。

现在还有一个问题,MetaServer 本身也是无状态以集群方式部署的,那么 Client/Protal 该如何发现 MetaServer 呢?一种传统的做法是借助硬件或者软件负载均衡器,例如在携程采用的是扩展后的 NginxLB(也称 Software Load Balancer),由运维为 MetaServer 集群配置一个域名,指向 NginxLB 集群,NginxLB 再对 MetaServer 进行负载均衡和流量转发。Client/Portal 通过域名 +NginxLB 间接访问 MetaServer 集群。

引入 MetaServer 和 NginxLB 之后的架构如下图所示:

Apollo 架构 V5

V4 版本已经是比较完成的 Apollo 架构全貌,现在还剩下最后一个环节:Portal 也是无状态以集群方式部署的,用户如何发现和访问 Portal?答案也是简单的传统做法,用户通过域名 +NginxLB 间接访问 Portal 集群。

所以 V5 版本是包括用户端的最终的 Apollo 架构全貌,如下图所示:

四、结论

  1. 经过我在第三部分的剖析之后,相信大家对 Apollo 的微服务架构会有更清晰的认识,作为一个思考题,大家再回头看一下第二部分宋顺给出的架构图,现在是否能够理解?它和我的架构是如何对应的?提示一下,宋顺的视角是一个从上往下的俯视视角,而我的是一个侧面视角。
  2. ConfgService/AdminService/Client/Portal 是 Apollo 的四个核心微服务模块,相互协作完成配置中心业务功能,Eureka/MetaServer/NginxLB 是辅助微服务之间进行服务发现的模块。
  3. Apollo 采用微服务架构设计,架构和部署都有一些复杂,但是每个服务职责单一,易于扩展。另外,Apollo 只需要一套 Portal 就可以集中管理多套环境 (DEV/FAT/UAT/PRO) 中的配置,这个是它的架构的一大亮点。
  4. 服务发现是微服务架构的基础,在 Apollo 的微服务架构中,既采用 Eureka 注册中心式的服务发现,也采用 NginxLB 集中 Proxy 式的服务发现。

附录:
https://github.com/ctripcorp/apollo

Apollo(阿波罗)架构深度剖析相关推荐

  1. 携程Apollo配置中心架构深度剖析

    通过学习 Apollo 的架构,带你深入理解微服务架构的基本原理 介绍    Apollo(阿波罗)[参考附录] 是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在不同环境.不同集 ...

  2. 【云驻共创】华为云云原生之Istio控制面架构深度剖析

    文章目录 前言 一.Istio的基本概念 1.Istio诞生背景 2.Istio的定义 3.Istio优势 二.Istio整体架构及工作原理 1.Istio整体架构 1.1 控制面Istiod 1.1 ...

  3. 云原生钻石课程 | 第2课:Kubernetes 技术架构深度剖析

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  4. 【MCtalk直播】全面复盘直播答题,深度剖析产品架构的难点与坑

    年后回来,朋友圈取而代之的,是被各种区块链刷屏.然而,年前一直火热的直播答题,似乎渐渐淡出了用户的视野. 风口什么时候出现?没有人能预测.一个爆款产品的走红,往往只需一两个月,就会有大批产品跟随,在线 ...

  5. 数据中心拥塞控制集中式架构Fastpass之深度剖析

    Fastpass深度剖析 Fastpass阅读笔记 Fastpass基本原理 概述: 时间槽分配算法 路径选择算法 容错 具体实现 实验验证 结论 Fastpass实际部署相关问题研究 Fastpas ...

  6. 【新书速递】从原理、架构、案例三个维度深度剖析分布式数据库

    分布式数据库是分布式计算与数据库结合的产物.分布式数据库的概念早就存在,但是直到最近才真正引起产业界的高度重视.这得益于互联网和云计算技术的高速发展与广泛应用. 以"国家政务服务平台&quo ...

  7. 云原生钻石课程 | 第6课:Kubernetes网络架构原理深度剖析(上)

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  8. 【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)

    文章目录 前言 一.Kubernetes诞生背景 1.云原生的概念 2.云原生架构 3.Kubernetes(k8s) 二.Kubernetes基本网络模型剖析 1.概念厘清 1.1 二层桥接 VS ...

  9. 深度剖析数据中台技术架构

    智领云联合创始人&CTO,前EA(艺电)大数据平台高级工程经理宋文欣博士再度直播开讲,为观众深度剖析了数据中台的技术架构. 数据中台的定义 在介绍数据中台技术架构之前,宋文欣博士表示,在谈到设 ...

最新文章

  1. 初步了解超图两种3D客户端 - iClient3D for_WebGL 和 iClient3D for_Plugin
  2. 内核启动流程分析(四)源码浅析
  3. python 三指针解决颜色分类
  4. netty系列之:轻轻松松搭个支持中文的服务器
  5. gradle 编译java_Java的Gradle依赖关系,使用编译还是实现?
  6. ThinkPHP6项目基操(15.实战部分 阿里云短信redis)
  7. 页面用ajax实现简单的连接数据库
  8. 064_将 Linux 系统中 UID 大于等于 1000 的普通用户都删除
  9. 切换到 oracle的 hr用户下面练习
  10. 翻译:道路机动车辆驾驶自动化系统相关术语的分类和定义 J3016_202104
  11. 【GBASE】DATA_FORMAT(date,format)格式详解
  12. 技术小咖之基于SDK的第一个windows图形界面程序
  13. no tests ran in 0.03 seconds
  14. 计算机网络4小时速成:应用层,cs模型,p2p模型,DNS域名系统,文件传输协议FTP,电子邮件SMTP,万维网HTTP,动态主机配置协议DHCP
  15. 二项堆(Binomial Heap)
  16. Linux上如何测试服务器之间的通信
  17. 支持自动查找和选择的ComboBox的具体实现
  18. (vant新手坑)引入Vant组件并改变其样式
  19. 自然保护区相关矢量数据下载
  20. echart自定义动画_ECharts使用—折线图动态加载

热门文章

  1. python开发微信订阅号如何申请_基于Python的微信公众平台二次开发(Python常用框架、订阅号开发、公众号开发)...
  2. 学习linux压缩命令压缩文档
  3. latex表格内容上下居中_LaTex表格内单元格内容换行
  4. 什么是灰度发布,以及灰度发布A/B测试
  5. 雷达革命,截止日期以及到达第四维度
  6. uniapp生成canvas商品海报
  7. php中相关乱码处理
  8. python中元组拆包_Python 元组拆包示例(Tuple Unpacking)
  9. Element_Table的单元格合并
  10. 南开大学计算机本科论文,南开大学本科(论文)模板.doc