完成了apollo配置中心的搭建工作之后,最重要的就是apollo配置中心的使用。Apollo的详细使用可参考apollo wiki中给出《Java客户端使用指南》 。
下面简单介绍快速使用,并会说到部署在docker中的项目作为apollo的客户端时,该如何配置,如何使用?
环境要求:java 1.7+ , Guava 15.0+ (apollo客户端默认引入19.0),如果你的项目引入的其他版本,确保版本号大于等于15.0
运行环境:windows, linux, docker
Apollo使用指南
访问apollo配置页面
默认登录账号: apollo/admin
项目中的配置
主要配置有三项:
(1)、配置AppId
AppId是应用的身份信息,是从服务端获取配置的一个重要信息。
此信息推荐通过配置文件的形式来配置,省的其他开发同事每次都配一遍的系统参数,配置文件的方式,官方wiki也给出来三种方式,下面列出我使用的一种:
配在app.properties文件中
确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:
app.id=YOUR-APP-ID
文件位置参考如下:
(2)、配置环境
在windows系统的开发环境,推荐通过配置文件的形式配置:
通过配置文件来指定env=YOUR-ENVIRONMENT
默认文件位置:
对于Mac/Linux,文件位置为/opt/settings/server.properties
对于Windows,文件位置为C:\opt\settings\server.properties
文件内容形如:
env=DEV
如果linux非docker中部署,同一台机器也可以这样配置,对一台服务来说这是一劳永逸的事情,其他项目共享此配置。
在docker中部署的项目,推荐使用java system property:
通过Java的System Property env来指定环境
在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT
如果是运行jar文件,需要注意格式是java -Denv=YOUR-ENVIRONMENT -jar xxx.jar
注意key为全小写
所以我们就可以想到docker的专属文件Dockerfile,如下图,在项目的resource的资源目录下
打开Dockerfile文件,如下图中,在参数ENTRYPOINT中加入系统参数-Denv=DEV,就可以了
为什么选用系统参数的形式,而不再用配置文件的形式呢?
第一,这种比较方便,丢到任何docker环境中都可以使用
第二,就是考虑docker的特殊性,配置文件放在外面访问不到,放在容器里面,每次部署项目都去重新配置,太不现实,更不友好。
当然,如果是非常熟悉docker,给项目的docker配置加一个文件卷的配置,不知是否可行,但也意味着,每个项目的docker配置都要加这种文件卷。
目前,env支持以下几个值(大小写不敏感):
DEV: Development environment
FAT: Feature Acceptance Test environment
UAT: User Acceptance Test environment
PRO: Production environment
更多环境定义,可以参考Env.java
(3)、引入相关jar
Maven项目:
直接引入apollo-client依赖
com.ctrip.framework.apollo
apollo-client
0.11.0-SNAPSHOT
普通java项目:
可以将编译后的jar直接丢进项目的lib目录。可以在maven私服里找到后下载,注意是com.ctrip.framework.apollo下个apollo-client,以及client依赖的apollo-core和其他的一些工具jar,具体如下图:
到此,客户端的配置就完成了。
配置的使用
原来就使用spring的情况下,大部分是不用改什么。
本地缓存路径
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。
Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data\{appId}\config-cache
本地配置文件会以下面的文件名格式放置于本地缓存路径下:
{appId}+{cluster}+{namespace}.properties
appId就是应用自己的appId,如100004458
cluster就是应用使用的集群,一般在本地模式下没有做过配置的话,就是default
namespace就是应用使用的配置namespace,一般是application
文件内容以properties格式存储,比如如果有两个key,一个是request.timeout,另一个是batch,那么文件内容就是如下格式:
request.timeout=2000
batch=2000
启动项目看下能否将配置文件从配置中心拉下来.
如果能拉下来则配置就成功了,不能则需检查前面的配置。
需要注意的一点是:
当类上使用@Configuration注解,则一定要注解@EnableApolloConfig一起使用,才可以生效。
就是说,所有需要在应用初始化之前获取变量的类上,都要加上此注解。