1. 背景
在实际项目中,Spring Boot项目结合使用Apollo配置中心时,经常会遇到需要更新Apollo上的项目的一些配置,比如测试环境或生产环境中,需要修改某个类的属性值,如果我们在Apollo上更新了配置,已经在运行的Spring Boot项目里默认是不生效的。为了避免重启项目才能生效,需要对Apollo配置更新进行监听,并进行一些处理,达到配置动态更新并生效。
2. 代码
maven依赖引入
<!-- Apollo配置中心 -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>
<!-- 监听apollo配置, 实时刷新 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<version>3.1.7</version>
</dependency>
监听类实现
package com.zsx.listener;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
/**
*
* @description: 监听apollo配置, 实时刷新
* @author: zsx
* @date: 2024/6/12 10:56
*/
@Configuration
public class ApolloConfigListener implements ApplicationContextAware {
/**
* 日志
*/
private static final Logger LOGGER = LoggerFactory.getLogger(ApolloConfigListener.class);
private ApplicationContext applicationContext;
/**
* 配置监听
* ApolloConfigChangeListener > value 属性默认 命名空间 "application"
*
* 示例: @ApolloConfigChangeListener(value = {"application", "test_space"})
*/
@ApolloConfigChangeListener(value = {"application", "application-comm", "application-dao", "common-redis"})
private void onChange(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
LOGGER.info("apollo key = {} refresh", key);
}
// 更新相应的bean的属性值,主要是存在@ConfigurationProperties注解的bean
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}