Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
它具有以下特点
统一管理不同环境、不同集群的配置 Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。 同一份代码部署在不同的集群,可以有不同的配置,比如zk的地址等 通过命名空间(namespace)可以很方便的支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖 配置修改实时生效(热发布) 用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序。 版本发布管理 所有的配置发布都有版本概念,从而可以方便的支持配置的回滚。 灰度发布 支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例。 权限管理、发布审核、操作审计 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。 所有的操作都有审计日志,可以方便的追踪问题。 客户端配置信息监控 可以方便的看到配置在被哪些实例使用 提供Java和.Net原生客户端 提供了Java和.Net的原生客户端,方便应用集成 支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+) 同时提供了Http接口,非Java和.Net应用也可以方便的使用 提供开放平台API Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。 不过Apollo出于通用性考虑,对配置的修改不会做过多限制,只要符合基本的格式就能够保存。 在我们的调研中发现,对于有些使用方,它们的配置可能会有比较复杂的格式,如xml, json,需要对格式做校验。 还有一些使用方如DAL,不仅有特定的格式,而且对输入的值也需要进行校验后方可保存,如检查数据库、用户名和密码是否匹配。 对于这类应用,Apollo支持应用方通过开放接口在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制 部署简单 配置中心作为基础服务,可用性要求非常高,这就要求Apollo对外部依赖尽可能地少 目前唯一的外部依赖是MySQL,所以部署非常简单,只要安装好Java和MySQL就可以让Apollo跑起来 Apollo还提供了打包脚本,一键就可以生成所有需要的安装包,并且支持自定义运行时参数
一 快速部署 (单机,单环境)
详情可参考官方文档https://github.com/ctripcorp/apollo/wiki/Quick-Start
这里做简单记录:
1.下载安装包
2.安装mysql数据库。版本要求为5.6+
3.创建数据库。包括两个。一个是元数据库,ApolloPortalDB。一个是环境数据库,ApolloConfigDB。相应的sql存放在安装包的sql目录下。库名可自定义。
4.修改配置。主要是启动脚本。demo.sh.
#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=密码(如果没有密码,留空即可)
5.启动。
Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。
执行demo.sh start命令。启动会很慢。
如果遇到以下错误是正常的。
注:在启动apollo-configservice的过程中会在日志中输出eureka注册失败的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。需要注意的是,这个是预期的情况,因为apollo-configservice需要向Meta Server(它自己)注册服务,但是因为在启动过程中,自己还没起来,所以会报这个错。后面会进行重试的动作,所以等自己服务起来后就会注册正常了
6.如果一切正常的话。通过8080端口可以看到注册中心界面如下。
通过8090端口可以看到哪下界面:
通过8070端口可以看到如下界面:
用户可以通过此界面创建一个项目。新增修改删除配置。并发布。如有错误可回滚上一版本。可创建灰度版本。可创建不同环境的配置。可查看配置发布历史,并选择版本回滚。
7.创建
创建一个项目,并发布一个配置:test->apollo
8使用
官方提供了java,.net客户端。也有网友提供了go,php,python等语言的http接口。这里使用java客户端。
8.1 新建一个项目,加入pom.xml
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.0.0</version> </dependency>
8.2创建appid,即哪一个项目,比如刚才我们创建了一个test项目的时候,会填写一个app.id,假如为test.
官方实际上提供了3种配置方式 ,这里只选择在项目中配置文件的方式 。
在resource目录下新建目录META-INF,然后创建文件app.properties.内容为app.id=test
8.3创建Apollo Meta Server。即每一个环境的服务地址。
官方同样提供了很多种创建方式。这里在本地的话,使用在项目中通过配置文件的方式指定。
在resource目录下创建apollo-env.properties,内容为
dev.meta=http://localhost:8080 fat.meta=http://localhost:8180 uat.meta=http://apollo.uat.xxx.com pro.meta=http://apollo.xxx.com
目前只是单环境,实际上只需要修改dev.meta的内容。其它环境在多环境部署时介绍。
8.4 指定环境 。哪怕是在单环境下,要使用配置,也是需要指定一个环境的。
官方提供的指定方式也蛮多。在开发环境下,可直接在eclipse里设定。
windon->preferences->java->Installed JREs
8.5 java的api
Config config = ConfigService.getAppConfig(); String value = config.getProperty("test", "default"); System.out.println("value = " + value);
输出
value = hello apollo
应用非常简单。
9 一些疑问。
9.1 在服务器修改了配置后,它真的能做到官方所言1秒钟实时推送到客户端吗?
可以。
Config config = ConfigService.getAppConfig(); while (true) { String value = config.getProperty("test", "default"); System.out.println("time = " + System.currentTimeMillis() + " value = " + value); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
输出
9.2 配置实际上是保存在mysql里面的,频繁读取会有额外的性能压力吗?
没有去调试去源码,但本地保存有一个缓存文件。在/opt/data/test/config-cache目录下,会有一个文件,保存有最新的配置数据。每次读取都是到这里获取。
二多环境部署。
1.直观上的区别 。首先我们来看快速单环境部署的目录。
直接从官网下载安装包,解压,得到这样的目录,修改配置,直接启动demo.sh就可以启动了。非常简单。
但是多环境布署的目录是这样的,假设部署DEV和FAT两个环境。
dev下
2.同样需要安装数据库。跟快速部署一样。一个是元数据库,ApolloPortalDB。环境数据库则需创建多个,ApolloConfigDB_DEV,ApolloConfigDB_FAT。相应的sql存放在安装包的sql目录下。库名可自定义。
3.打开ApolloPortalDB库serverconfig表,修改apollo.portal.envs值,默认为dev,加入需要配置的其它环境。如fat,如自定义。不区分大小写。
4.打开ApolloConfigDB_DEV或者 ApolloConfigDB_FAT库,打开serverconfig表,修改eureka.service.url注册服务中心地址。
具体怎么修改呢?
假设我们现在是要部署dev和fat两个环境,由单环境部署可知,服务启动会有三个端口,分别是配置中心8070,注册服务8080,admin服务8090,
假设我们规划,由于8070端口只有一个
dev环境中三个端口分别为 8070,8080,8090
fat环境中三个端口分别为 8070,8180,8090
那么ApolloConfigDB_DEV中由于默认关系可以不用修改,而ApolloConfigDB_FAT中则需要把eureka.service.url修改为http://localhost:8180/eureka/
5准备工作完成,开始下载或者编译安装包。
我选择的是下载源码,编译。在script目录下有个build.bat和build.sh文件,点击联网自动完成编译。
获取三个目录apollo-adminservice apollo-configservice apollo-portal 下的target文件下的zip文件。放入创建好的dev/adminservice dev/configservice 目录下并解压。portal 只需放在一个目录 下。
6首先启动portal
首先在config目录下修改application-github.properties文件相关mysql配置
# DataSource spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = 123456
然后修改apollo-env.properties中各个环境注册中心的服务地址
dev.meta=http://localhost:8080 fat.meta=http://localhost:8180
然后点击script目录下startup.sh启动。
7启动dev环境
7.1首先启动adminservcie,首先修改config目录下application-github.properties文件中mysql配置
# DataSource spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_DEV?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = 123456
修改script目录下start.sh中关于端口SERVER_PORT=8090。
点击script目录下start.sh启动。
7.2然后启动configservice,首先修改config目录下application-github.properties文件中mysql配置
修改script目录下start.sh中关于端口SERVER_PORT=8080。
点击script目录下start.sh启动。
8启动fat环境
8.1首先启动adminservice,首先修改config目录下application-github.properties文件中mysql配置
# DataSource spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_FAT?characterEncoding=utf8 spring.datasource.username = root spring.datasource.password = 123456
修改script目录下start.sh中关于端口SERVER_PORT=8190。
点击script目录下start.sh启动。
8.2然后启动configservice,首先修改config目录下application-github.properties文件中mysql配置
修改script目录下start.sh中关于端口SERVER_PORT=8180。
点击script目录下start.sh启动。
9.启动成功后,通过8070端口可以看到如下画面,环境列表中出现了两个。
在dev环境中加入配置test->apollodev,fat环境中加入test->apollofat,通过切换不同的环境可以得到不同的值。
参考自apollo官方文档
https://github.com/ctripcorp/apollo