1. 官方有下载相应的 jar,不过 jar 中指定了环境,默认了几个环境:<br />local.meta=[http://localhost:8080](http://localhost:8080)dev.meta=${dev_meta}<br />fat.meta=${fat_meta}<br />uat.meta=${uat_meta}<br />lpt.meta=${lpt_meta}<br />pro.meta=${pro_meta}<br />这几个环境不一定适合自己。

自编译

修改 src\main\resources\apollo-env.properties 配置,屏蔽掉所有环境,打包(可以使用默认的 build.bat或build.sh 脚本)
数据库建立
使用jar + 命令行参数运行(vm 参数)

  1. portal 参数:
  2. -Xmx128m -Xms128m -Dspring.datasource.url="jdbc:mysql://localhost:3306/ApolloPortalDB?sslMode=DISABLED&serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false" -Dspring.datasource.username="root" -Dspring.datasource.password="123456" -Ddev_meta="http://localhost:8080" -Dfile.encoding=UTF-8
  3. adminconfig 参数
  4. -Xmx128m -Xms128m "-Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?sslMode=DISABLED&serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false" -Dspring.datasource.username=root -Dspring.datasource.password=123456 -Dspring.jpa.database-platform=org.hibernate.dialect.MySQLDialect -Dfile.encoding=UTF-8

界面的使用参考官网,包括配置,密钥使用等。

几个服务

  • 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进程中

config service 服务 客户端的配置

  • 提供配置获取接口
  • 提供配置更新推送接口(基于Http long polling)
    • 服务端使用Spring DeferredResult实现异步化,从而大大增加长连接数量
    • 目前使用的tomcat embed默认配置是最多10000个连接(可以调整),使用了4C8G的虚拟机实测可以支撑10000个连接,所以满足需求(一个应用实例只会发起一个长连接)。
  • 接口服务对象为Apollo客户端

admin service 服务 portal

  • 提供配置管理接口
  • 提供配置修改、发布等接口
  • 接口服务对象为Portal

portal service 服务可视化配置

  • 提供Web界面供用户管理配置
  • 通过Meta Server获取Admin Service服务列表(IP+Port),通过IP+Port访问服务
  • 在Portal侧做load balance、错误重试

几个术语概念

在介绍高级特性前,我们有必要先来了解一下Apollo中的几个核心概念:

  1. application (应用)
    • 这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
    • 每个应用都需要有唯一的身份标识 — appId,我们认为应用身份是跟着代码走的,所以需要在代码中配置,具体信息请参见Java客户端使用指南
  2. environment (环境)
    • 配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
    • 我们认为环境和代码无关,同一份代码部署在不同的环境就应该能够获取到不同环境的配置
    • 所以环境默认是通过读取机器上的配置(server.properties中的env属性)指定的,不过为了开发方便,我们也支持运行时通过System Property等指定,具体信息请参见Java客户端使用指南
  3. cluster (集群)
    • 一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
    • 对不同的cluster,同一个配置可以有不一样的值,如zookeeper地址。
    • 集群默认是通过读取机器上的配置(server.properties中的idc属性)指定的,不过也支持运行时通过System Property指定,具体信息请参见Java客户端使用指南
  4. namespace (命名空间)
    • 一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
    • 应用可以直接读取到公共组件的配置namespace,如DAL,RPC等
    • 应用也可以通过继承公共组件的配置namespace来对公共组件的配置做调整,如DAL的初始数据库连接数

重点关注其设计文档,不仅仅要做一个 coder,还要是一个 设计者,架构者。