java项目的业务配置,通常通过读取classpath下的properties、xml文件配置来获取。
apache commons configuration开源项目提供了动态获取配置的能力:如果修改环境中的文件配置,可以在运行中读取到新的配置内容。
但是,使用这个需要注意,如果配置内容被用于在启动创建bean的阶段,在bean创建完成后,一般就不会再从配置读取了,除非重启再次创建bean。
1. 添加依赖
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
2. 添加配置读取代码
public abstract class AbstractProperties {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractProperties.class);
private static final long REFRESH_DELAY = 5 * 60 * 1000;
protected PropertiesConfiguration propConfiguration;
public AbstractProperties() {
try {
propConfiguration = new PropertiesConfiguration();
propConfiguration.load(getFilePath());
FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy();
strategy.setRefreshDelay(REFRESH_DELAY);
propConfiguration.setEncoding(Constant.CODE_UTF_8);
propConfiguration.setReloadingStrategy(strategy);
} catch (ConfigurationException e) {
LOGGER.error("load properties file failed.exception={}", e);
}
}
public String getOrDefault(String key, String defaultValue) {
String value = propConfiguration.getString(key);
if (StringUtils.isNotEmpty(value)) {
value = value.trim();
}
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
return value;
}
}
实际业务配置:
public class EnvironmentProperties extends AbstractProperties {
@Getter
private static final EnvironmentProperties INSTANCE = new EnvironmentProperties();
@Override
public String getFilePath() {
return ResourceUtils.getClassResourcePath("environment.properties");
}
public static String getBussinessKey() {
return INSTANCE.getPropConfiguration().getString("keyName", "defaultValue");
}
}
3. 通过etcd+confd,可以集中配置,配置下发到节点
参考https://blog.csdn.net/bbwangj/article/details/82953786