龙空技术网

携程Apollo(阿波罗)分布式配置中心-总体架构设计和核心概念

软件架构 1138

前言:

现时兄弟们对“携程技术中心组织架构”大约比较关怀,我们都想要了解一些“携程技术中心组织架构”的相关知识。那么小编也在网上搜集了一些对于“携程技术中心组织架构””的相关内容,希望你们能喜欢,朋友们快快来了解一下吧!

携程Apollo(阿波罗)分布式配置中心

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

服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。

.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。

Apollo 具备功能统一管理不同环境(Environment)、不同集群(Cluster)、不同命名空间(Namespace)的配置。配置修改实时生效(热发布)。版本发布管理灰度发布权限管理、发布审核、操作审计客户端配置信息监控提供Java和.Net原生客户端提供开放平台API部署简单(目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来)Apollo 总体架构设计

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

上图简要描述了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. 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)

2. 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。

* 这是一个fallback机制,为了防止推送机制失效导致配置不更新。

* 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified。

* 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。

3. 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中。

4. 客户端会把从服务端获取到的配置在本地文件系统缓存一份。

* 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置。

5. 应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知。

Apollo 的核心概念

application (应用)

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

每个应用都需要有唯一的身份标识——appId,我们认为应用身份是跟着代码走的,所以需要在代码中配置:

Java 客户端通过 classpath:/META-INF/app.properties 来指定 appId.Net 客户端通过 app.config 来指定 appId

environment (环境)

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

我们认为环境和代码无关,同一份代码部署在不同的环境就应该能够获取到不同环境的配置。所以环境默认是通过读取机器上的配置(server.properties 中的 env 属性)指定的。

不过为了开发方便,我们也支持运行时通过 System Property (-Denv=YOUR-ENVIRONMENT)等指定,server.properties 文件路径如下:

Windows: C:\opt\settings\server.propertiesLinux/Mac: /opt/settings/server.properties

cluster (集群)

一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。对不同的 cluster,同一个配置可以有不一样的值,如 ZooKeeper 地址。

集群默认是通过读取机器上的配置(server.properties 中的 idc 属性)指定的,不过也支持运行时通过 System Property 指定。

namespace (命名空间)

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

应用可以直接读取到公共组件的配置 namespace,如 DAL,RPC 等。应用也可以通过继承公共组件的配置 namespace 来对公共组件的配置做调整,如 DAL 的初始数据库连接数。

设置 Environment

Environment可以通过以下3种方式的任意一个配置:

1. 通过Java System Property

可以通过Java的System Property env来指定环境在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT如果是运行jar文件,需要注意格式是java -Denv=YOUR-ENVIRONMENT -jar xxx.jar注意key为全小写

2. 通过操作系统的System Environment

还可以通过操作系统的System Environment ENV来指定注意key为全大写

3. 通过配置文件

最后一个推荐的方式是通过配置文件来指定env=YOUR-ENVIRONMENT

对于Mac/Linux,文件位置为/opt/settings/server.properties对于Windows,文件位置为C:\opt\settings\server.properties

文件内容形如:

env=DEV

目前,env支持以下几个值(大小写不敏感):

DEV-Development environmentFAT-Feature Acceptance Test environmentUAT-User Acceptance Test environmentPRO-Production environment

更多环境定义,可以参考Env.java

标签: #携程技术中心组织架构