spring+apollo動態(tài)獲取yaml格式的配置方式
默認spring裝載的都是.properties格式的配置文件,但是有時我們需要定義list或者map類型的配置,那么yaml就具有優(yōu)勢。
以下演示利用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參數(shù)的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)
@Slf4j
public 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格式問題
以縮進代表層級關系
空格個數(shù)不重要,但是同一層級必須左對齊
大小寫敏感
格式為: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動態(tài)獲取yaml格式的配置方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
線程池ThreadPoolExecutor使用簡介與方法實例
今天小編就為大家分享一篇關于線程池ThreadPoolExecutor使用簡介與方法實例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解
這篇文章主要介紹了Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
Activiti工作流學習筆記之自動生成28張數(shù)據(jù)庫表的底層原理解析
這篇文章主要介紹了Activiti工作流學習筆記之自動生成28張數(shù)據(jù)庫表的底層原理解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
SpringBoot+Resilience4j實現(xiàn)接口限流的示例代碼
Resilience4j 是一個用于實現(xiàn)熔斷、限流、重試等功能的輕量級庫,本文主要介紹了SpringBoot+Resilience4j實現(xiàn)接口限流的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-12-12
Jasypt的StandardPBEByteEncryptor使用源碼解析
這篇文章主要介紹了Jasypt的StandardPBEByteEncryptor使用源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09

