简介
简介
  What's
    Apollo（阿波罗）是携程的开源配置管理中心
      能够集中化管理应用不同环境、不同集群的配置，配置修改后能够实时推送到应用端，并且具备规范的权限、流程治理等特性。
      Apollo支持4个维度管理Key-Value格式的配置
        application (应用)
        environment (环境)
        cluster (集群)
        namespace (命名空间)
  Why
    统一管理不同环境、不同集群的配置
    配置修改实时生效（热发布）
    版本发布管理
    灰度发布
    权限管理、发布审核、操作审计
    客户端配置信息监控
    提供Java和.Net原生客户端
    提供开放平台API
    部署简单
  对配置的定义
    配置是独立于程序的只读变量
      配置首先是独立于程序的，同一份程序在不同的配置下会有不同的行为。
      其次，配置对于程序是只读的，程序通过读取配置来改变自己的行为，但是程序不应该去改变配置。
      常见的配置有：DB Connection Str、Thread Pool Size、Buffer Size、Request Timeout、Feature Switch、Server Urls等。
    配置伴随应用的整个生命周期
      配置贯穿于应用的整个生命周期，应用在启动时通过读取配置来初始化，在运行时根据配置调整行为。
    配置可以有多种加载方式
      配置也有很多种加载方式，常见的有程序内部hard code，配置文件，环境变量，启动参数，基于数据库等
    配置需要治理
      权限控制
      不同环境、集群配置管理
      框架类组件配置管理
  核心概念
    application (应用)
      这个很好理解，就是实际使用配置的应用，Apollo客户端在运行时需要知道当前应用是谁，从而可以去获取对应的配置
      每个应用都需要有唯一的身份标识 -- appId，我们认为应用身份是跟着代码走的，所以需要在代码中配置
    environment (环境)
      配置对应的环境，Apollo客户端在运行时需要知道当前应用处于哪个环境，从而可以去获取应用的配置
      我们认为环境和代码无关，同一份代码部署在不同的环境就应该能够获取到不同环境的配置
      所以环境默认是通过读取机器上的配置（server.properties中的env属性）指定的，不过为了开发方便，我们也支持运行时通过System Property等指定
    cluster (集群)
      一个应用下不同实例的分组，比如典型的可以按照数据中心分，把上海机房的应用实例分为一个集群，把北京机房的应用实例分为另一个集群。
      对不同的cluster，同一个配置可以有不一样的值，如zookeeper地址。
      集群默认是通过读取机器上的配置（server.properties中的idc属性）指定的，不过也支持运行时通过System Property指定
    namespace (命名空间)
      一个应用下不同配置的分组，可以简单地把namespace类比为文件，不同类型的配置存放在不同的文件中，如数据库配置文件，RPC配置文件，应用自身的配置文件等
      应用可以直接读取到公共组件的配置namespace，如DAL，RPC等
      应用也可以通过继承公共组件的配置namespace来对公共组件的配置做调整，如DAL的初始数据库连接数