這篇文章主要講解了spring+apollo怎么動態(tài)獲取yaml格式的配置,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計制作、網(wǎng)站制作、平果網(wǎng)絡(luò)推廣、小程序定制開發(fā)、平果網(wǎng)絡(luò)營銷、平果企業(yè)策劃、平果品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供平果建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
默認(rèn)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> 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 Listlist; 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.add(val); } } list = newList; }); } }
補充知識:yml格式問題
以縮進代表層級關(guān)系
空格個數(shù)不重要,但是同一層級必須左對齊
大小寫敏感
格式為:key= value
注釋單行用#,只能注釋單行
application.properties中
logging.level.root=DEBUG
logging.level.org.springframework=DEBUG
logging.level.org.org.mybatis=DEBUG
轉(zhuǎn)化為application.yml中
logging:
level:
root: DEBUG
org.springframework: DEBUG
org.org.mybatis: DEBUG
冒號后面必須跟空格,否則格式錯誤
看完上述內(nèi)容,是不是對spring+apollo怎么動態(tài)獲取yaml格式的配置有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。