spring+apollo动态获取yaml格式的配置方式

网友投稿 1808 2023-06-09

spring+apollo动态获取yaml格式的配置方式

spring+apollo动态获取yaml格式的配置方式

默认spring装载的都是.properties格式的配置文件,但是有时我们需要定义list或者map类型的配置,那么yaml就具有优势。

以下演示利用apollo来完成自动更新ip白名单的功能

1.重写配置工厂

public class YmlPropertySourceFactory extends DefaultPropertySourceFactory {

public PropertySource> createPropertySource(String name, EncodedResource resource) throws IOException {

String configName = resource.getResource().getFilename();

ConfigFile configFile = ConfigService.getConfigFile(configName.substring(0, configName.indexOf(".")), ConfigFileFormat.YML);

String ct = configFile.getContent();

return YamlPropUtil.buildYaml(configName, ct);

}

}

定义-D参数的appid和conf目录

public class YamlPropUtil {

public static PropertySource buildYaml(String name, String content) throws IOException {

String sysName = System.getProperty("app.id");

String appDir = System.getProperty("apollo.cacheDir");

if (appDir.endsWith(File.separator)) {

appDir= appDir.substring(0, appDir.length() - 1);

}

String filePath = appDir+ File.separator + sysName + File.separator + name;

File file = new File(filePath);

if (file.exists()) {

file.delete();

}

try (BufferedWriter bufferedWriter = Files.newWriter(file, Charsets.UTF_8)) {

bufferedWriter.write(content);

bufferedWriter.flush();

List> sources = new YamlPropertySourceLoader().load(name, new FileSystemResource(filePath));

return sources.get(0);

} catch (IOException e) {

throw e;

}

}

}

2.装载配置

whiteList.yml

注意本地也要存放上述文件在classpath下

white:

ip:

#ip白名单列表

list:

- 192.168.103.34

- 192.168.1.102

@Configuration

@ConfigurationProperties(prefix = "white.ip")

@PropertySource(value = "classpath:whiteList.yml", factory = YmlPropertySourceFactory.class)

@Slf4j

public class IpWhiteListService {

private List list;

private final static int MAX_PROP_ITEM = 1000;

private final static String PROP_NAME = "whiteList.yml";

private final static String KEY_PREFIX = "white.ip.list";

public void setList(List list) {

this.list = list;

}

public boolean isAllow(String address) {

return list.contains(address);

}

@ApolloConfigChangeListener(PROP_NAME)

public void onChange(ConfigChangeEvent changeEvent) {

Set keys = changeEvent.changedKeys();

keys.forEach(e -> {

String newVal = changeEvent.getChange(e).getNewValue();

log.debug("whiteList is changed={}", newVal);

String ct = newVal;

org.springframework.core.env.PropertySource propertySource = null;

try {

propertySource = YamlPropUtil.buildYaml(PROP_NAME, ct);

} catch (IOException ex) {

log.error("", e);

}

List newList = Lists.newArrayList();

for (int i = 0; i < MAX_PROP_ITEM; i++) {

String pName = KEY_PREFIX + "[" + i + "]";

if (propertySource.containsProperty(pName)) {

String val = (String) propertySource.getProperty(pName);

newList.addhttp://(val);

}

}

list = newList;

});

}

}

补充知识:yml格式问题

以缩进代表层级关系

空格个数不重要,但是同一层级必须左对齐

大小写敏感

格式为:key= value

注释单行用#,只能注释单行

application.properties中

logging.level.root=DEBUG

logging.level.org.springframework=DEBUG

logging.level.org.org.mybatis=DEBUG

转化为application.yml中

logging:

level:

root: DEBUG

org.springframework: DEBUG

org.org.mybaXJwVrtis: DEBUG

冒号后面必须跟空格,否则格式错误

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot拦截器原理解析及使用方法
下一篇:Spring Boot从Controller层进行单元测试的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~