1. 概述
Apollo携程开源配置管理中心,集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。Apollo支持4个维度管理 Key-Value 格式配置:application (应用)
environment (环境)
cluster (集群)
namespace (命名空间)
。
1.1. 特性
- 统一管理不同环境、不同集群的配置。
- Apollo提供了一个统一界面集中式管理不同环境
environment
不同集群cluster
不同命名空间namespace
的配置。 - 同一份代码部署在不同的集群,可以有不同的配置,比如 zookeeper 的地址等。
- 通过命名空间
namespace
可以很方便地支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖。 - 配置修改实时生效
热发布
用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。 - 版本发布管理。
- 所有的配置发布都有版本概念,从而可以方便地支持配置的回滚。
- 灰度发布;支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。
- 权限管理、发布审核、操作审计。
- 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。
- 所有的操作都有审计日志,可以方便地追踪问题。
- 客户端配置信息监控。
- 可以在界面上方便地看到配置在被哪些实例使用。
- 提供 Java 和 .Net 原生客户端。
- 支持
Spring Placeholder
Annotation
Spring Boot ConfigurationProperties
方便应用使用(需要Spring 3.1.1+)。 - 同时提供了Http接口,非 Java 和 .Net 应用也可以方便地使用。
- 支持
- 提供开放平台API。
- Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验,如数据库用户名、密码,Redis服务地址等。
- 对于这类应用配置,Apollo支持应用方通过开放平台API在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制。
- 部署简单。
- 配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少。
- 目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来。
- Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数。
1.2. 对比
| 功能点 | Apollo | Spring cloud config | | :—-: | :—-: | :—-: | | 配置界面 | 统一界面管理不同环境/集群配置 | 无,Git操作 | | 配置生效时间 | 实时 | 重启生效,或Refresh,或Git hook + MQ | | 版本管理 | 界面上提供发布历史和回滚按钮 | 无,Git操作 | | 灰度发布 | 支持 | 不支持 | | 授权/审计/审核 | 界面操作支持修改和发布权限分离 | 通过Git仓库设置,不支持支持修改和发布权限分离 | | 实例配置监控 | 可查询哪些客户端在使用哪些配置 | 不支持 | | 配置获取性能 | 数据库+缓存支持(快速) | 从git clone repo本地文件读取 | | 客户端支持 | 原生支持Java/.Net,提供API,支持Spring annotation | Spring应用 + annotation支持 |
1.3. 概念
**Namespace**
相当于spring boot项目中的配置文件。具备properties
xml
yml
yaml
json
等格式。Namespace 权限分为两种:private(私有)
public(公共)
权限是相对于Apollo客户端。Namespace类型分三种:私有类型
公共类型
关联类型(继承类型)
私有类型
只能被所属的应用获取。一个应用尝试获取其它应用 private Namespace404
异常。公共类型
public权限的Namespace,能被任何应用获取。**关联类型**
又可称为继承类型,关联类型具有private权限。关联类型的Namespace继承于公共类型的Namespace,用于覆盖公共Namespace的某些配置。2. 搭建
| 依赖 | 描述 | | :—-: | :—-: | | JDK | Server 1.8+ / Client 1.7+ | | MySQL | 5.6.5+ | | Quick Start | https://github.com/nobodyiam/apollo-build-scripts |
Apollo服务端共需要两个数据库:ApolloPortalDB 和 ApolloConfigDB。验证方法:ApolloPortalDB
select `Id`, `AppId`, `Name` from ApolloPortalDB.App;
ApolloConfigDB
select `NamespaceId`, `Key`, `Value`, `Comment` from ApolloConfigDB.Item;
2.1. DataSource
填入的用户需要具备对 ApolloPortalDB 和 ApolloConfigDB 数据的读写权限。
# apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8 apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8 apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)
2.2. 启动
Quick Start脚本启动三个端口 8070
8080
8090
服务,确保端口未被占用时下执行脚本
Master:~root#./demo.sh start
==== starting service ====
Service logging file is ./service/apollo-service.log Started [10768]
Waiting for config service startup.......
Config service started.
You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log Started [10846]
Waiting for portal startup......
Portal started.
You can visit http://localhost:8070 now!
异常:
**com.sun.jersey.api.client.ClientHandlerException**
Apollo向注册中心注册失败。
3. Springboot 集成
**Server**
URL:http://localhost:8070 初始账号/密码:admin/apolloClient 缓存文件
Mac / Linux
/opt/data/{appId}/config-cacheWindows
C:\opt\data{appId}\config-cache
本地配置文件会以 {appId}
+ {cluster}
+ {namespace}.properties
的文件名和格式存储,当获取不到网络配置时会从这个配置中取值。
4.1. pom
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
4.2. yaml
app:
id: test-app
apollo:
meta: http://localhost:8080
#cluster: myCluster
#cacheDir: /opt/testDir
bootstrap:
enable: true
namespaces: application
env: DEV
app.id
服务端web页面上创建的项目APP id。apollo.meta
服务端地址。apollo.cluster
配置集群名称。apollo.cacheDir
自定义缓存路径。apollo.bootstrap.enable
是否在工程启动的bootstrap阶段向Spring容器注入被托管的namespaces中的配置。apollo.bootstrap.namespaces
使用namespaces。apollo.bootstrap.env
要获取的配置环境,不区分大小写。(DEV
Development environment /FAT
Feature Acceptance Test environment /UAT
User Acceptance Test environment /PRO
Production environment )4.3. @EnableApolloConfig
@EnableApolloConfig @SpringBootApplication public Class Application { public static void main(String[] args){ SpringApplication.run(Application.class,args); } }