时间:2021-05-19
默认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<PropertySource<?>> 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)@Slf4jpublic class IpWhiteListService { private List<String> 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<String> list) { this.list = list; } public boolean isAllow(String address) { return list.contains(address); } @ApolloConfigChangeListener(PROP_NAME) public void onChange(ConfigChangeEvent changeEvent) { Set<String> 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<String> 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.add(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.mybatis: DEBUG
冒号后面必须跟空格,否则格式错误
以上这篇spring+apollo动态获取yaml格式的配置方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
什么是yaml一种标记语言。yaml是专门用来写配置文件的语言,非常简洁和强大更直观,更方便,有点类似于json格式yaml文件格式:test.yaml安装ya
spring多文件配置:1、properties文件2、YAML文件一、properties文件在SpringBoot中,多环境配置的文件名需要满足applic
01YAML文件介绍K8S在启动Pod的时候,会使用yaml文件的方式来启动,今天我们来看看YAML文件最常用的格式。YAML的语法和JSON语法很像,都是通过
最近处理一些配置文件,碰到了YAML格式的文件,因为之前没接触过此格式的文件,对于XML还比较熟悉一些。那么什么是YAML呢?它相比XML又有哪些优缺点呢?什么
使用Java的方式配置Spring我们现在要完全不使用Spring的xml配置,全权使用Java来配置Spring!JavaConfig是Spring的一个子项