设计
设计
  Namespace
    什么是Namespace
      Namespace是配置项的集合，类似于一个配置文件的概念。
    格式有哪些
      配置文件有多种格式，例如：properties、xml、yml、yaml、json等。
    获取权限
      private权限
        private权限的Namespace，只能被所属的应用获取到。
      public权限
        public权限的Namespace，能被任何应用获取。
    如何获取 Namespace
      客户端获取“application” Namespace
        Config config = ConfigService.getAppConfig();
      客户端获取非“application” Namespace
        Config config = ConfigService.getConfig(namespaceName);
  模型
    1. 用户在配置中心对配置进行修改并发布
    2. 配置中心通知Apollo客户端有配置更新
    3. 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进程中
  Client 设计
    描述
      客户端和服务端保持了一个长连接，从而能第一时间获得配置更新的推送。
      客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。
        这是一个fallback机制，为了防止推送机制失效导致配置不更新
        客户端定时拉取会上报本地版本，所以一般情况下，对于定时拉取的操作，服务端都会返回304 - Not Modified
        定时频率默认为每5分钟拉取一次，客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖，单位为分钟。
      客户端从Apollo配置中心服务端获取到应用的最新配置后，会保存在内存中
      客户端会把从服务端获取到的配置在本地文件系统缓存一份
        在遇到服务不可用，或网络不通的时候，依然能从本地恢复配置
      应用程序从Apollo客户端获取最新的配置、订阅配置更新通知