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<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格式问题

以缩进代表层级关系

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

大小写敏感

格式为: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格式的配置方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解springboot读取yml配置的几种方式

    yml 文件规则 yml文件的好处,天然的树状结构,一目了然,实质上跟properties是差不多的. 不支持tab缩进 可以使用 "-小写字母" 或 "_小写字母"来 代替 "大写字母",如 userName 与 user-name ,user_name 含义是一样的 key: value 格式书写 key 后面跟着冒号,再后面跟着一个空格,然后是值 几种数据格式的表示方式 1.普通的值(数字,字符串,布尔) 2.对象.Map (属性和值) (

  • Springboot项目如何使用apollo配置中心

    这篇文章主要介绍了Springboot项目如何使用apollo配置中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 引入 apollo 配置依赖 <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.1.0<

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

    默认spring装载的都是.properties格式的配置文件,但是有时我们需要定义list或者map类型的配置,那么yaml就具有优势. 以下演示利用apollo来完成自动更新ip白名单的功能 1.重写配置工厂 public class YmlPropertySourceFactory extends DefaultPropertySourceFactory { public PropertySource<?> createPropertySource(String name, Encode

  • 集成apollo动态日志取缔logback-spring.xml配置

    目录 前言 APOLLO动态日志 spring日志系统热更新日志级别 apollo日志配置变更动态下发 实现日志调整热更新 消灭LOGBACK-SPRING.XML配置 Logback加载原理 javaBean加载SentryAppender 前言 动态调整线上日志级别是一个非常常见的场景,借助apollo这种配置中心组件非常容易实现.作为apollo的官方技术支持,博主经常在技术群看到有使用者询问apollo是否可以托管logback的配置文件,毕竟有了配置中心后,消灭所有的本地配置全部交给a

  • Spring Boot中获取request的三种方式及请求过程

    目录 一.请求过程 二.获取request的三种方式 2.1.可以封装为静态方法 2.2.controller的方法里面 2.3.直接注入 三.request常用API 3.1.request路径相关 3.2.Header相关 3.3.获取请求体 3.4.获取参数 3.5.中文乱码 3.6.转发 3.7.共享数据 四.response常用API 五.常用工具类 5.1.封装的 5.2.Hutool工具类 本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧!

  • Spring 3.x中三种Bean配置方式比较详解

    以前Java框架基本都采用了XML作为配置文件,但是现在Java框架又不约而同地支持基于Annotation的"零配置"来代替XML配置文件,Struts2.Hibernate.Spring都开始使用Annotation来代替XML配置文件了:而在Spring3.x提供了三种选择,分别是:基于XML的配置.基于注解的配置和基于Java类的配置. 下面分别介绍下这三种配置方式:首先定义一个用于举例的JavaBean. package com.chinalife.dao public cl

  • Spring Task 动态修改任务执行计划cron方式

    目录 Spring Task 动态修改任务执行计划cron 原理 Demo如下 Spring @Scheduled定时任务动态修改cron参数 Spring Task 动态修改任务执行计划cron Spring Task 能够在不重启服务的情况下,动态修改批量任务执行时间. 原理 Spring Task目前仅支持TriggerContext上修改下次执行时间(批量任务执行后回调SchedulingConfigurer.configureTasks,让用户可以重新设置Trigger,从而动态修改下

  • Spring RedisTemplate 批量获取值的2种方式小结

    目录 Spring RedisTemplate 批量获取值 1.利用mGet 2.利用PipeLine Java对Redis的批量操作RedisTemplate 1.背景 2.操作 3.说明 Spring RedisTemplate 批量获取值 1.利用mGet List<String> keys = new ArrayList<>(); //初始keys List<YourObject> list = this.redisTemplate.opsForValue().

  • spring cloud gateway跨域全局CORS配置方式

    在Spring 5 Webflux中,配置CORS,可以通过自定义WebFilter实现: 注:此种写法需真实跨域访问,监控header中才会带相应属性. 代码实现方式 import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import or

  • 使用spring动态获取接口的不同实现类

    目录 spring动态获取接口的不同实现类 当时想到了两种解决办法 获取某接口所有实现类 正文 结果 spring动态获取接口的不同实现类 最近做项目,有个需求是和外部对接,从接口获取新闻数据,把数据和缓存中的数据对比,多了的添加到数据库,少了的删掉. 接口有两个,一开始我是在业务类里写了两个方法,代码太长,简单说就是两个部分: public Object saveANews() { //1.获取A接口新闻列表 //2.和缓存对比,存数据到数据库 } public Object saveBNew

  • Spring Boot使用yml格式进行配置的方法

    1.yml 格式 现在大家发现,在springboot里还是要用到配置文件的. 除了使用.properties外,springboot还支持 yml格式. 个人觉得yml格式的可读性和..properties比起来差不多,有时候还没有不如properties 看起来那么规整. 但是考虑到很多springboot项目会使用yml格式,还是简单讲讲,主要目的还是为了读懂其他人的项目. 2.同样内容,不同写法 如图所示,左边是application.properties的写法,右边是applicati

  • Spring Cloud动态配置刷新RefreshScope使用示例详解

    目录 引言 一.了解@RefreshScope,先要了解@Scope 二.RefreshScope 的实现原理 三.使用——@RefreshScope 使用流程 引言 用过Spring Cloud的同学都知道在使用动态配置刷新的我们要配置一个 @RefreshScope,在类上才可以实现对象属性的的动态更新. @RefreshScope 能实现动态刷新全仰仗着 @Scope这个注解. 一.了解@RefreshScope,先要了解@Scope 1.RefreshScope继承于GenericSco

随机推荐