前言
近日由于公司项目配置较多,发现管理起来十分繁琐。所以加入了Apollo来管理项目的配置文件。按照以前,我们改了项目的配置之后都需要重新启动项目来重新加载配置文件,这样在线上如果我们只是想改一个小的配置都要重启整个项目,这个太麻烦了。加入Apollo之后我们可以直接对项目的配置文件进行管理,然后修改之后发布至线上,不需要重启就可以搞到,非常的方便。
正文
1、介绍
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。
.Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。
更多介绍参见Apollo配置中心介绍。
关于Java的开发指南可以参考Java客户端开发指南。
2、环境要求
2.1、Java 1.7+
2.2、Guava 15.0+(Apollo客户端默认会引用Guava 19,如果你的项目引用了其它版本,请确保版本号大于等于15.0)
3、必要配置
3.1、appid
appid是在Apollo管理页面上配置的。代表一个应用的身份信息,也就是每个应用都有一个自己的appid,不可以重复。
四种配置方式:
1、通过System Property传入app.id信息
2、通过System Environment的APP_ID传入appid信息
3、通过Spring Boot的application.properties文件配置app.id属性
4、通过app.properties文件设置app.id属性,位置:classpath:/META-INF/app.properties
3.2、meta sever
Apollo支持我们的应用在不同的环境有不同的配置,所以需要在运行告诉Apollo我们现在运行的是什么环境。
配置方式:
1、通过System Property传入apllo.mata信息
2、通过Spring Boot的application.properties或者bootstrap.properties文件配置apllo.meta属性
3、通过System Environment的APOLLO_META传入meta sever信息
4、通过server.properties文件配置apollo.meta属性
对于Mac/Linux,文件位置为/opt/settings/server.properties
对于Windows,文件位置为C:\opt\settings\server.properties
5、通过app.properties文件设置apollo.meta属性,位置:classpath:/META-INF/app.properties
6、还可以通过分环境的方式配置,具体参考Java客户端开发指南。
3.3、本地缓存路径
Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。
本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限,也可以通过设置自定义缓存路径。
1、通过System Property传入apollo.cacheDir信息
2、通过System Environment的APOLLO_CACHEDIR传入本地缓存路径信息
3、通过Spring Boot的application.properties文件配置apollo.cacheDir属性
4、通过server.properties文件配置apollo.meta属性
对于Mac/Linux,文件位置为/opt/settings/server.properties
对于Windows,文件位置为C:\opt\settings\server.properties
4、与SpringBoot项目集成
Apollo与SpringBoot项目集成十分简单,我们在Apollo管理页面上建立好我们的应用之后。 得到AppId,这里假设我们的AppId为:apollo_test
加入项目依赖包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.3.0</version>
</dependency>
在application.properties中加入配置:
app.id=apollo_test #指定在Apollo管理页面上创建完应用的appId
apollo.cacheDir=/opt/ourpalm/data/apollo/config-cache #自定义本地缓存路径
apollo.meta=http://test-apollo.gamebean.net #指定环境 这里的meta地址是需要在Apollo管理页面上配置好的
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application.properties,apollo_test.properties #指定Apollo管理的配置文件
加入实时监测配置文件变化:
@Component
@EnableApolloConfig
public class SpringBootApolloRefreshConfig implements ApplicationContextAware {
private static final Logger logger = LoggerFactory.getLogger(SpringBootApolloRefreshConfig.class);
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@ApolloConfigChangeListener({"application.properties","apollo_test.properties"}) // 监测的配置文件
public void onChange(ConfigChangeEvent changeEvent) { // 配置文件变更时触发此方法
logger.info("ApolloConfigChangeListener refresh config!");
for(String event :changeEvent.changedKeys())
{
logger.info("changedKey:{}",event);
}
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
}
}
5、测试
新建测试Bean:
@Component
@Data
public class TestConfig { // 测试Bean
@Value("${test:123}") // 接取配置文件中test属性的值,如果没有配置默认为123
private String test;
}
新建测试接口:
@RequestMapping(value = { "test2/*/*" })
@Controller
public class TestController {
private static OPLog log = OPLog.getLog(TestController.class);
@Autowired
TestConfig testConfig;
/**
* 测试方法
*/
@RequestMapping(value = { "/test2/apollo/test"})
@ResponseBody
public String test() {
log.info("test的值:" + testConfig.getTest());
return testConfig.getTest();
}
}
在Apollo管理页面中对应环境的apollo_test配置文件下,在实例列表中可以看到读取当前配置文件的实例。然后我们新增配置:
新增属性test,值为:Apollo First Test,并选择需要发布的环境,这里DEV代表开发环境,FAT代表测试环境,PRO代表正式环境。
提交,然后发布。发布之后可以看到项目控制台输出:
请求测试接口返回:
在Apollo管理页面修改test属性值为:Apollo Second Test,提交发布之后再次请求接口返回(无需重启项目):
关于Apollo管理页面的搭建,请大家参考Apollo配置中心介绍,后续更新管理页面搭建的博文。