zoukankan      html  css  js  c++  java
  • Apollo——Apollo配置中心设计

    Apollo配置中心设计

    一、总体设计

    1.1 基础模型

      • 用户在配置中心对配置进行修改并发布
      • 配置中心通知 Apollo 客户端有配置更新
      • Apollo 客户端从配置中心拉取最新的配置、更新本地配置并通知到应用

    1.2 架构模块

        下图是Apollo架构模块的概览,详细说明可以参考Apollo配置中心架构剖析。 overall-architecture

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

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

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

      • Config Service 和 Admin Service 都是多实例、无状态部署,所以需要将自己注册到 Eureka 中并保持心跳。
      • 在 Eureka 之上我们架了一层 Meta Server 用于封装 Eureka 的服务发现接口。

      • Client 通过域名访问 Meta Server 获取 Config 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 Why Eureka

    为什么我们采用Eureka作为服务注册中心,而不是使用传统的zk、etcd呢?我大致总结了一下,有以下几方面的原因:

      • 它提供了完整的 Service Registry 和 Service Discovery 实现
        • 首先是提供了完整的实现,并且也经受住了 Netflix 自己的生产环境考验,相对使用起来会比较省心。
      • 和 Spring Cloud 无缝集成
        • 我们的项目本身就使用了 Spring Cloud 和 Spring Boot,同时 Spring Cloud 还有一套非常完善的开源代码来整合 Eureka,所以使用起来非常方便。
        • 另外,Eureka 还支持在我们应用自身的容器中启动,也就是说我们的应用启动完之后,既充当了 Eureka 的角色,同时也是服务的提供者。这样就极大的提高了服务的可用性。
        • 这一点是我们选择 Eureka 而不是 zk、etcd 等的主要原因,为了提高配置中心的可用性和降低部署复杂度,我们需要尽可能地减少外部依赖。
      • Open Source
        • 最后一点是开源,由于代码是开源的,所以非常便于我们了解它的实现原理和排查问题。

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

    1.3.1 Config Service

        • 提供配置获取接口

        • 提供配置更新推送接口(基于Http long polling
          • 服务端使用 Spring DeferredResult 实现异步化,从而大大增加长连接数量.
          • 目前使用的 tomcat embed 默认配置是最多10000个连接(可以调整),使用了 4C8G 的虚拟机实测可以支撑 10000 个连接,所以满足需求(一个应用实例只会发起一个长连接)。
        • 接口服务对象为Apollo客户端

    1.3.2 Admin Service

        • 提供配置管理接口
        • 提供配置修改、发布等接口
        • 接口服务对象为Portal

    1.3.3 Portal

        • 提供 Web 界面供用户管理配置
        • 通过 Meta Server 获取 Admin Service 服务列表(IP+Port),通过IP+Port访问服务
        • 使用客户端软负载SLB方式调用 AdminService

    1.3.4 Client

        • Apollo 提供的客户端程序,为应用提供配置获取、实时更新等功能
        • 通过 Meta Server 获取 Config Service 服务列表(IP+Port),通过IP+Port访问服务
        • 使用客户端软负载SLB方式调用 ConfigService

    1.4 三个辅助服务发现模块

    1.4.1 Meta Server

        • Portal 通过域名访问 Meta Server 获取 Admin Service 服务列表(IP+Port)
        • Client 通过域名访问 Meta Server 获取 Config Service 服务列表(IP+Port)
        • Meta Server 从 Eureka 获取 Config Service 和 Admin Service 的服务信息,相当于是一个 Eureka Client
        • 增设一个 Meta Server 的角色主要是为了封装服务发现的细节,对 Portal 和 Client 而言,永远通过一个 Http 接口获取 Admin Service 和 Config Service 的服务信息,而不需要关心背后实际的服务注册和发现组件
        • Meta Server 只是一个逻辑角色,在部署时和 Config Service 是在一个 JVM 进程中的,所以 IP、端口和 Config Service 一致

    1.4.2 Eureka

        • 基于 Eureka 和 Spring Cloud Netflix 提供服务注册和发现
        • Config Service 和 Admin Service 会向 Eureka 注册服务,并保持心跳
        • 为了简单起见,目前 Eureka 在部署时和 Config Service 是在一个 JVM 进程中的(通过Spring Cloud Netflix)

    1.4.3 NginxLB

        • 和域名系统配合,协助 Portal 访问 MetaServe 获取 AdminService 地址列表

        • 和域名系统配合,协助 Client 访问 MetaServer 获取 ConfigService 地址列表

        • 和域名系统配合,协助用户访问 Portal 进行配置管理

    二、服务端设计

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

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

    1、用户在 Portal 操作配置发布。

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

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

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

     三、客户端设计

    上图简要描述了Apollo客户端的实现原理:

      • 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过 Http Long Polling 实现)。
      • 客户端还会定时从 Apollo 配置中心服务端拉取应用的最新配置。
        • 这是一个 fallback 机制,为了防止推送机制失效导致配置不更新;
        • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified;
        • 定时频率默认为每 5 分钟拉取一次,客户端也可以通过在运行时指定 System Property: apollo.refreshInterval 来覆盖,单位为分钟;
      • 客户端从 Apollo 配置中心服务端获取到应用的最新配置后,会保存在内存中。
      • 客户端会把从服务端获取到的配置在本地文件系统缓存一份。
        • 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置;
      • 应用程序可以从 Apollo 客户端获取最新的配置、订阅配置更新通知。

    3.1 和 Spring 集成的原理

        Apollo除了支持 API 方式获取配置,也支持和 Spring/Spring Boot 集成,集成原理简述如下。

    Spring从3.1版本开始增加了 ConfigurableEnvironment 和 PropertySource

        • ConfigurableEnvironment
          • Spring的ApplicationContext会包含一个Environment(实现ConfigurableEnvironment接口)
          • ConfigurableEnvironment自身包含了很多个PropertySource
        • PropertySource
          • 属性源
          • 可以理解为很多个Key - Value的属性配置

      需要注意的是,PropertySource 之间是有优先级顺序的,如果有一个 Key 在多个 property source 中都存在,那么在前面的 property source 优先。

      在理解了上述原理后,Apollo 和 Spring/Spring Boot 集成的手段就呼之欲出了:在应用启动阶段,Apollo 从远端获取配置,然后组装成 PropertySource 并插入到第一个即可,如下图所示:

     四、可用性考虑

    场景影响降级原因
    某台Config Service下线 无影响   Config Service无状态,客户端重连其它Config Service
    所有Config Service下线 客户端无法读取最新配置,Portal 无影响 客户端重启时,可以读取本地缓存配置文件。如果是新扩容的机器,可以从其它机器上获取已缓存的配置文件,具体信息可以参考Java客户端使用指南 - 1.2.3 本地缓存路径  
    某台Admin Service下线 无影响   Admin Service无状态,Portal重连其它Admin Service
    所有Admin Service下线 客户端无影响,Portal无法更新配置    
    某台Portal下线 无影响   Portal域名通过SLB绑定多台服务器,重试后指向可用的服务器
    全部Portal下线 客户端无影响,Portal无法更新配置    
    某个数据中心下线 无影响   多数据中心部署,数据完全同步,Meta Server/Portal域名通过SLB自动切换到其它存活的数据中心
    数据库宕机 客户端无影响,Portal无法更新配置 Config Service开启配置缓存后,对配置的读取不受数据库宕机影响

     五、监控相关

    5.1 Tracing

    5.1.1 CAT

    Apollo客户端和服务端目前支持CAT自动打点,所以如果自己公司内部部署了CAT的话,只要引入cat-client后Apollo就会自动启用CAT打点。

    如果不使用CAT的话,也不用担心,只要不引入cat-client,Apollo是不会启用CAT打点的。

    Apollo也提供了Tracer相关的SPI,可以方便地对接自己公司的监控系统。

    更多信息,可以参考v0.4.0 Release Note

    5.1.2 SkyWalking

        可以参考@hepyu贡献的apollo-skywalking-pro样例

    5.2 Metrics

        从1.5.0版本开始,Apollo服务端支持通过 /prometheus 暴露 prometheus 格式的 metrics,如http://${someIp:somePort}/prometheus

  • 相关阅读:
    jq原创幻灯片插件slideV1.0
    jq原创弹出层折叠效果
    jq实现鼠标经过图片翻滚效果
    开源代码的来源
    名词解析
    Joomla软件的简单介绍
    Java集合类的使用
    笔记
    MySQL基础篇一
    MySQL基础篇一
  • 原文地址:https://www.cnblogs.com/zuoyang/p/15709880.html
Copyright © 2011-2022 走看看