Disconf实践指南:改造篇
上一篇文章Disconf实践指南:使用篇介绍了如何在项目中应用disconf,虽然实现了分布式配置的实时刷新,但是我们希望能够去除所有的配置文件,把配置都交给disconf管理,本地只需要实现配置监听接口就好了。
改造包括:
统一配置到disconf
自定义配置解析实现
公共配置 #实现ing
1、统一配置到disconf
主要是应用各个环境的配置信息,比如当前应用的配置信息application-default.properties如下:
env=dev
spring.application.name=springboot-learning-example
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.port=9999
logging.path=/Users/chubin/logs
在disconf控制台新建配置文件,命名为app.properties,同时将本地application-default.properties文件删除,重新启动应用,如果启动成功说明配置生效了。那么为什么不用像之前redis.properties一样本地创建监听文件呢?注意到disconf.xml配置文件中有如下的配置:
其中的location属性就表示app.properties这个文件disconf会帮你托管,项目启动或者配置更新的时候会自动reload到本地,实时刷新。这里有一个关键的类ReloadablePropertiesFactoryBean
,它是真正实现配置更新的核心,实现了配置更新回调并设置新的value。
如果还有其他环境的配置信息,都可以迁移到disconf,区别在于选择的环境不一样。这样我们就将本地的应用配置迁移到了disconf。
2、自定义配置解析
在分布式系统中,为了实现代码不同的逻辑分支,比如灰度可以需要灰度发布的城市,没有打开灰度的城市走老逻辑,打开灰度的城市走新逻辑。这种情况下就需要使用分布式配置动态修改了。
之前的redis.properties已经实现了动态更新和实时生效,但是缺点是需要本地实现更新服务接口并且添加redis.properties的key作为更新服务的属性,那么可不可以只实现更新接口却不需要添加配置的key作为属性呢?当然是可以的。通过实现IDisconfUpdatePipeline
接口自定义配置的解析方式。
该接口需要实现reloadDisconfFile方法,入参是key和filePath,key表示配置文件的名称,如果应用有多个配置文件,那么修改其中一个文件的配置时,其他配置也会reload到本地,所以需要对关心的配置文件执行reload自定义解析。
一种思路是在ReloadablePropertiesFactoryBean
中将配置设置到spring的environment环境变量中,然后配置更新的时候直接从环境变量直接获取就可以了。修改源码如下:
Environment environment = applicationContext.getEnvironment();
ConfigurableEnvironment env = (ConfigurableEnvironment) environment;
env.getPropertySources().addFirst(
new PropertiesPropertySource("springboot-demo", properties));
log.debug("inject properties to env:{}", properties);
所以reloadDisconfFile方法可以如下实现:
Map<String, Object> cacheMap = new HashMap<>();
PropertySource<?> propertySource = env.getPropertySources().get("springboot-demo");
if (propertySource instanceof PropertiesPropertySource) {
PropertiesPropertySource propertiesPropertySource = (PropertiesPropertySource) propertySource;
Map<String, Object> objectMap = propertiesPropertySource.getSource();
for (Map.Entry<String, Object> e : objectMap.entrySet()) {
cacheMap.put(e.getKey(), e.getValue());
}
}
这样就将disconf的配置封装成了一个Map,要获取某个值直接去get就可以获取到了,相比之前的一坨配置是不是简化了很多。
至此,终于可以愉快的使用disconf了。
Disconf实践指南:改造篇的更多相关文章
- Disconf实践指南:使用篇
在上一篇文章Disconf实践指南:安装篇介绍了如何在本地搭建Disconf环境,下面我们介绍如何在项目中使用Disconf.由于某些功能特性对源码做了修改,所以在官方文档并没有提及. 环境基于mac ...
- Disconf实践指南:安装篇
Disconf是百度开源出来的一款基于Zookeeper的分布式配置管理软件.目前很多公司都在使用,包括滴滴.百度.网易.顺丰等公司.通过简单的界面操作就可以动态修改配置属性,还是很方便的.使用Dis ...
- 如何让HTTPS站点评级达到A+? 还得看这篇HTTPS安全优化配置最佳实践指南
0x00 前言简述 SSL/TLS 简单说明 描述: 当下越来越多的网站管理员为企业站点或自己的站点进行了SSL/TLS配置, SSL/TLS 是一种简单易懂的技术,它很容易部署及运行,但要对其进行安 ...
- 【转载】 Spark性能优化指南——基础篇
转自:http://tech.meituan.com/spark-tuning-basic.html?from=timeline 前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能 ...
- 【转】【技术博客】Spark性能优化指南——高级篇
http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...
- 【转】Spark性能优化指南——基础篇
http://mp.weixin.qq.com/s?__biz=MjM5NDMwNjMzNA==&mid=2651805828&idx=1&sn=2f413828d1fdc6a ...
- [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务
转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...
- [CoreOS 转载] CoreOS实践指南(五):分布式数据存储Etcd(上)
转载:http://www.csdn.net/article/2015-01-22/2823659 摘要:在“漫步云端:CoreOS实践指南”系列的前几篇,分别介绍了如何架设CoreOS集群,系统服务 ...
- [CoreOS 转载] CoreOS实践指南(四):集群的指挥所Fleet
转载:http://www.csdn.net/article/2015-01-14/2823554/2 摘要:CoreOS是采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...
随机推荐
- HAWQ + MADlib 玩转数据挖掘之(五)——奇异值分解实现推荐算法
一.奇异值分解简介 奇异值分解简称SVD(singular value decomposition),可以理解为:将一个比较复杂的矩阵用更小更简单的三个子矩阵的相乘来表示,这三个小矩阵描述了大矩阵重要 ...
- Android中破解应用签名校验的后续问题处理方案(闪退和重启现象以及无效问题)
一.前言 之前已经写了一个爆破签名校验的工具kstools,很多同学也在使用,但是也反馈了不少问题,之前一篇文章也介绍了,关于爆破之后第三方登录问题修复,这篇我们在综合说明一下一些后遗症问题,关于ks ...
- printf格式输出数字,位数不够前面补0,适用与输出编号
printf格式输出数字,位数不够前面补0,适用与输出编号 printf格式输出:%[flags][width][.perc][F|N|h|l]type 用到了flags中的 0 (注意是零不是欧) ...
- keras channels_last、preprocess_input、全连接层Dense、SGD优化器、模型及编译
channels_last 和 channels_first keras中 channels_last 和 channels_first 用来设定数据的维度顺序(image_data_format). ...
- Linux运行环境搭建(一)——安装JDK
下载Linux版jdk 官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html 解压并拷贝到指定目录 tar zxv ...
- JVM原理三-----GC模块,垃圾回收
GC方法:在JVM启动时填入参数(比如:-XX:+UseConcMarkSweepGC ) 算法区分: 1.古老回收算法: Reference Counting ,对象有一个引用,即增加一个计数,删 ...
- 阿里云ECS 环境是CentOS 7.3安装mongodb3
CentOS安装mongodb https://www.cnblogs.com/zddzz/p/10069912.html CentOS安装mongodb 我的是阿里云ECS 环境是CentOS 7. ...
- NET Core项目模板
打造自己的.NET Core项目模板 https://www.cnblogs.com/catcher1994/p/10061470.html 前言 每个人都有自己习惯的项目结构,有人的喜欢在项目里面建 ...
- Apache报错You don't have permission to access on this server
解决方法: 打开httpd.conf文件 <Directory /> AllowOverride none Require all denied </Directory> 修改 ...
- javascript把json串转成对象
// 这个是待转的json串 var jstr = "{'a':100,'b':'aaa'}"; // 经过下面语句把这个语句描述的对象数据,赋给这个m对象了 eval (&quo ...