Disconf实践指南:改造篇
2017-06-18 13:50
211 查看
上一篇文章Disconf实践指南:使用篇介绍了如何在项目中应用disconf,虽然实现了分布式配置的实时刷新,但是我们希望能够去除所有的配置文件,把配置都交给disconf管理,本地只需要实现配置监听接口就好了。
改造包括:
统一配置到disconf
自定义配置解析实现
公共配置 #实现ing
1、统一配置到disconf
主要是应用各个环境的配置信息,比如当前应用的配置信息application-default.properties如下:
在disconf控制台新建配置文件,命名为app.properties,同时将本地application-default.properties文件删除,重新启动应用,如果启动成功说明配置生效了。那么为什么不用像之前redis.properties一样本地创建监听文件呢?注意到disconf.xml配置文件中有如下的配置:
其中的location属性就表示app.properties这个文件disconf会帮你托管,项目启动或者配置更新的时候会自动reload到本地,实时刷新。这里有一个关键的类
如果还有其他环境的配置信息,都可以迁移到disconf,区别在于选择的环境不一样。这样我们就将本地的应用配置迁移到了disconf。
2、自定义配置解析
在分布式系统中,为了实现代码不同的逻辑分支,比如灰度可以需要灰度发布的城市,没有打开灰度的城市走老逻辑,打开灰度的城市走新逻辑。这种情况下就需要使用分布式配置动态修改了。
之前的redis.properties已经实现了动态更新和实时生效,但是缺点是需要本地实现更新服务接口并且添加redis.properties的key作为更新服务的属性,那么可不可以只实现更新接口却不需要添加配置的key作为属性呢?当然是可以的。通过实现
该接口需要实现reloadDisconfFile方法,入参是key和filePath,key表示配置文件的名称,如果应用有多个配置文件,那么修改其中一个文件的配置时,其他配置也会reload到本地,所以需要对关心的配置文件执行reload自定义解析。
一种思路是在
所以reloadDisconfFile方法可以如下实现:
这样就将disconf的配置封装成了一个Map,要获取某个值直接去get就可以获取到了,相比之前的一坨配置是不是简化了很多。
至此,终于可以愉快的使用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实践指南:安装篇
- WebSphere环境搭建实践指南
- Python机器学习实践指南 笔记(3)--IPO新股买入
- Google 官方应用架构的最佳实践指南
- 数据仓库专题(16)-分布式数据仓库实践指南-目录篇
- CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南
- 循序渐进的增长黑客指南:如何提高用户留存(实践方法篇)
- Windows Phone 7 模式与实践指南
- hibernate SQLQuery实践指南
- STL实践指南(上)
- AngularJS 指令Directives实践指南(一)
- React Router 最新指南与异步加载实践
- 《敏捷软件测试:测试人员与敏捷团队的实践指南》学习感悟(一)
- DBA_实践指南系列6_Oracle Erp R12工作流通知邮件配置Email(案例)
- DBA_实践指南系列7_Oracle Erp R12监控OAM(案例)
- 网络改造项目方案规划与实践报告