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 Namespace 404 异常。
  • 公共类型 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

  1. 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/apollo
Client 缓存文件
Mac / Linux /opt/data/{appId}/config-cache
Windows 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);
      }    
    }