Apollo简介
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
特点:
- 统一管理不同环境、不同集群的配置
- Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
- 同一份代码部署在不同的集群,可以有不同的配置,通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖.
- 配置修改实时生效(热发布)
用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。 - 版本发布管理
所有的配置发布都有版本概念,从而可以方便的支持配置的回滚。 - 灰度发布
支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。 - 权限管理、发布审核、操作审计
应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。
所有的操作都有审计日志,可以方便的追踪问题。
核心概念:
- application (应用)
这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置每个应用都需要有唯一的身份标识 – appId,我们认为应用身份是跟着代码走的,所以需要在代码中配置。 - environment (环境)
配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置我们认为环境和代码无关,同一份代码部署在不同的环境就应该能够获取到不同环境的配置所以环境默认是通过读取机器上的配置(server.properties中的env属性)指定的,不过为了开发方便,我们也支持运行时通过System Property等指定。 - cluster (集群)
一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。对不同的cluster,同一个配置可以有不一样的值,如zookeeper地址。
集群默认是通过读取机器上的配置(server.properties中的idc属性)指定的,不过也支持运行时通过System Property指定,具体信息请参见Java客户端使用指南。 - namespace (命名空间)
一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等。
模块架构:
上图简要描述了 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进程中。
2、分布式部署指南
2.1、环境
1.1 Java Apollo服务端:1.8+ Apollo客户端:1.7+
1.2 MySQL 版本要求:5.6.5+
2.2、部署步骤
2.2.1、获取安装包:
方式1:直接下载安装包,GitHub地址:https://github.com/ctripcorp/apollo/releases,Apollo服务端安装包共有3个:apollo-configservice, apollo-adminservice, apollo-portal。
方式2:下载源码,自己打包。GitHub地址:https://github.com/ctripcorp/apollo
学习建议使用直接下载安装包:
这里我们下载的是1.6.1版本的安装包
2.2.2、创建数据库
Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB
获取建库脚本:刚才下载的是1.6.1的安装包,所以这里也要获取1.6.1版本的建库脚本。
打开apollo源码:https://github.com/ctripcorp/apollo
分支切换到1.6.1 并进入script/sql目录
这里两个就是建库脚本,执行
2.2.2、启动安装包
数据库创建已创建成功,解压这三个安装包.
配置数库地址:
1、在apollo-adminservice-1.6.1-github和apollo-configservice-1.6.1-github 的 config/application-github.properties 中配置数据地址:ApolloConfigDB数据库的访问地址:
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = root 数据
spring.datasource.password = hong10086
2、在apollo-portal-1.6.1-github的 config/application-github.properties 中配置数据地址:ApolloPortalDB数据库的访问地址:
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = hong10086
这三个安装包的启动顺序是configservice在adminservice 前启动,portal是管理界面这里最后启动。启动和关闭的脚步分别在三个安装包的script文件夹中。
启动 configservice:
异常1:
日志输出目录没有权限,解决方法 1、赋予目录的执行权限;2、修改日志的输出目录,在startup.sh 中就可以修改。
我的是mac,直接手动创建了一个/opt目录
查看日志 eureka server启动成功:
以同样的方法启动adminservice、portal。
服务检查:
三个服务启动完成后 在浏览器中输入portal 的访问地址http://localhost:8070 用户名:apollo 密码: admin
点击右侧的“管理员工具” -> “系统信息” 出现了异常
这里的意思就是potal 管理平台无法访问 meta server ,meta server的配置地址是http://fill-in-dev-meta-server:8080,显然本地是不存在着个地址的。meta server 简单理解就是这里的eureka 的地址,eureka是在configservice中,所以这里应该配置confgservice地址 http://localhost:8080
在eureka中我们可以发现configservice、adminservice已经注册完成了。
如何指定potal中的 meta server地址?
打开:apollo-portal-1.6.1-github/config/apollo-env.properties
可以看出一个potal可以指定多个meta server地址,通过环境来区分这里默认有de、fat、uat、pro四个环境 。
本次只改dev环境的地址:将dev.meta=http://fill-in-dev-meta-server:8080改成dev.meta=http://localhost:8080
保存后重启potal
再次验证:
再次打开apollo的系统信息页面,可以发现configservice、adminservice已经可以被发现了。
2.3、实例演示
2.3.1创建一个项目:
部门和人员都可以自定义:
1、自定义的部门:
在“管理员工具”->“系统参数”中设置。
这里不仅可以设置部门,还可以设置 ApolloPortalDB.ServerConfig表中的所有数据,如果已存在配置项则会覆盖,否则会创建配置项。配置更新后,一分钟后自动生效。
ApolloPortalDB.ServerConfig表:
2、添加用户:
在“管理员工具”->“户名管理”中设置。
“新建配置” name=王二 然后 “发布”
java客户端读取配置:
引入jar包:
1 2 3 4 5 | <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.4.0</version> </dependency> |
读取配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Test { public static void main(String[] args) throws Exception { while (true) { Config config = ConfigService.getAppConfig(); String key = "name"; String defaultValue = ""; String value = config.getProperty(key, defaultValue); System.out.println("name = " + value); TimeUnit.SECONDS.sleep(5); } } } |
java客户端代码编写完成,这时要向apollo读取配置,apollo上有许多环境,每个环境又有许多应用。因此要告诉客户端读取那个环境下的那个应用。告诉的方式有很多这里使用最简单的
这是启动客户端便可以读取配置了:
java客户端配置环境(
配置
AppId是应用的身份信息,是从服务端获取配置的一个重要信息。有以下几种方式设置,按照优先级从高到低分别为:
1、System Property
Apollo 0.7.0+支持通过System Property传入app.id信息,如 :-Dapp.id=YOUR-APP-ID
2、操作系统的System Environment
Apollo 1.4.0+支持通过操作系统的System Environment APP_ID来传入app.id信息,如:APP_ID=YOUR-APP-ID
3、Spring Boot application.properties
Apollo 1.0.0+支持通过Spring Boot的application.properties文件配置,如 :app.id=YOUR-APP-ID,该配置方式不适用于多个war包部署在同一个tomcat的使用场景
4、app.properties
确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:app.id=YOUR-APP-ID
配置环境(
Apollo支持应用在不同的环境有不同的配置,所以需要在运行提供给Apollo客户端当前环境的Apollo Meta Server信息。默认情况下,meta server和config service是部署在同一个JVM进程,所以meta server的地址就是config service的地址。
有以下几种方式设置,,按照优先级从高到低分别为:
1、通过Java System Property apollo.meta
可以通过Java的System Property apollo.meta来指定
在Java程序启动脚本中,可以指定-Dapollo.meta=http://config-service-url
如果是运行jar文件,需要注意格式是java -Dapollo.meta=http://config-service-url -jar xxx.jar
也可以通过程序指定,如System.setProperty("apollo.meta", "http://config-service-url");
2、通过Spring Boot的配置文件
可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.meta=http://config-service-url
该配置方式不适用于多个war包部署在同一个tomcat的使用场景
3、通过操作系统的System EnvironmentAPOLLO_META
可以通过操作系统的System Environment APOLLO_META来指定
注意key为全大写,且中间是_分隔
4、通过server.properties配置文件
可以在server.properties配置文件中指定apollo.meta=http://config-service-url
对于Mac/Linux,文件位置为/opt/settings/server.properties
对于Windows,文件位置为C:\opt\settings\server.properties
5、通过app.properties配置文件
可以在classpath:/META-INF/app.properties指定apollo.meta=http://config-service-url
6、通过Java system property ${env}_meta
如果当前env是dev,那么用户可以配置-Ddev_meta=http://config-service-url
使用该配置方式,那么就必须要正确配置Environment,详见1.2.4.1 Environment
7、通过操作系统的System Environment ${ENV}_META (1.2.0版本开始支持)
如果当前env是dev,那么用户可以配置操作系统的System Environment DEV_META=http://config-service-url
注意key为全大写 使用该配置方式,那么就必须要正确配置Environment,详见1.2.4.1 Environment
8、通过apollo-env.properties文件
用户也可以创建一个apollo-env.properties,放在程序的classpath下,或者放在spring boot应用的config目录下
使用该配置方式,那么就必须要正确配置Environment,详见1.2.4.1 Environment
文件内容形如:
dev.meta=http://1.1.1.1:8080
fat.meta=http://apollo.fat.xxx.com
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xx