洞察如何利用移动警务平台提高安全保障效率,数字化转型助力合规运营
1808
2023-06-09
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
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
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
this.list = list;
}
public boolean isAllow(String address) {
return list.contains(address);
}
@ApolloConfigChangeListener(PROP_NAME)
public void onChange(ConfigChangeEvent changeEvent) {
Set
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
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~