2020-08-28
本文只介绍Springboot项目接入Apollo配置中心的过程。在实践过程中,我发现不需要进行那么繁琐的配置就可以实现,故写本文章对使用指南进行简化,用于记录备忘,以便于以后springboot项目快速接入Apollo配置中心。
更详细的接入请参考Apollo官方提供的Java客户端使用指南:https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#%E4%BA%8Cmaven-dependency
本文的前提条件:Apollo配置中心的服务端已经搭建好并且已经在Apollo的管理界面中新建了该springboot项目对应的应用,而且namespace中已经添加了所有的配置。
一、准备工作
1.1 环境要求
- Java: 1.7+
- Guava: 15.0+
-
- Apollo客户端默认会引用Guava 19,如果你的项目引用了其它版本,请确保版本号大于等于15.0
1.2 引入Apollo客户端依赖
在Springboot项目的pom.xml中引入Apollo客户端依赖,目前中央仓库中是1.1.0版本,以后使用时如果中央仓库有更新可以调整版本信息。
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
1.3 必选设置
1.3.1 AppId
AppId是应用的身份信息,是从服务端获取配置的一个重要信息。本文通过app.properties文件的方式进行配置。
在src/main/resources路径下新建META-INF文件夹,然后新建app.properties文件,在文件中添加app.id=YOUR-APP-ID。完成后项目的目录结构及app.properties文件内容如下:
1.3.2 Apollo Meta Server
Apollo支持应用在不同的环境有不同的配置,所以需要在运行时提供给Apollo客户端当前环境的Apollo Meta Server信息。默认情况下,meta server和config service是部署在同一个JVM进程,所以meta server的地址就是config service的地址。
本文在Springboot配置文件中进行配置。在Spring Boot的application.properties或bootstrap.properties中指定apollo.meta=http://config-service-url。本项目是在bootstrap.yml中添加相应的配置,添加内容如下所示:
1.3.3 本地缓存路径
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本文通过配置Spring Boot的配置文件自定义了缓存的路径,可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.cacheDir=/opt/data/some-cache-dir,配置如下:
1.4 自定义Apollo Meta Server地址定位逻辑
Apollo提供了MetaServerProvider SPI,用户可以注入自己的MetaServerProvider来自定义Meta Server地址定位逻辑。
因为本项目是单环境的,所以MetaServerProvider的实现就参考了指南上的DefaultMetaServerProvider。如果是多环境的话就可以参考LegacyMetaServerProvider。
1.5 可选设置
可选设置包括环境、集群、内存中配置项的顺序及配置访问秘钥的设置。因为该项目是基于Apollo提供的快速启动的配置中心接入的,所以没有多环境和集群,这里就没有做特殊设置。如果有需求的话根据Apollo的Java客户端使用指南设置即可。
二、和Springboot整合
2.1 添加配置
在springboot的配置文件中添加引入Apollo的配置:
1. 注入默认application namespace的配置示例
# will inject 'application' namespace in bootstrap phase
apollo.bootstrap.enabled = true
2. 注入非默认application namespace或多个namespace的配置示例
apollo.bootstrap.enabled = true
# will inject 'application', 'FX.apollo' and 'application.yml' namespaces in bootstrap phase
apollo.bootstrap.namespaces = application,FX.apollo,application.yml
本项目就使用了默认的namespace,所以使用方式1进行配置。
2.2 添加Apollo的配置类
添加Apollo的配置类,使得通过@Value的方式可以引用到Apollo配置中心与app.id名称一致的应用的namespace中配置的属性值。
本项目添加了ApolloConfig类,注意在类上面需要添加@Configuration和@EnableApolloConfig注释。
至此,Springboot项目的属性值就能通过@Value的方式获取到了。经过测试,在Config类、Controller类、Service类中都可以通过@Value获取到配置中心的属性值,并且配置中心的值修改完发布后,项目里面的值也会实时更新。