一、设计背景
在系统构建过程中以及业务系统运行过程中,涉及到很多可能随时变化的动态参数,在JavaWeb相关系统内,参数配置存在有很多种方式,对现有的参数配置方式进行分析参见表1-1:
表1-1 参数配置方式分析
配置方式 | 存在问题 | 备注 |
代码内字符窜字面量配置 | 每次参数的修改都需要重新编译 | |
properties配置文件/xml配置文件 | 普通用法虽然将参数从代码内抽离出来,但是无法随时更新生效 | spring提供的ReloadableResourceBundleMessageSource工具类可以实现热加载Properties文件,将参数配置文件从代码分离可以做到不停机不重启做参数维护,并被程序加载,但是仍需系统重新从文件资源内获取新的参数值 |
JMX参数配置 | 标准MBEAN是有侵入性的,他要管理的对象是符合JAVA BEAN规范的对象。但是要作为标准MBEAN而被管理,就需要实现一个接口。这个接口的名称必须是类名加上MBean。 | Spring支持将普通Bean通过配置MBeanExporter生成MBean |
基于上述分析,设计实现一个低侵入的便捷参数配置中心。
二、功能模块图
参数中心系统主要为实现多系统、多模式、安全、动态维护的参数配置;支持方便快捷的参数导入导出功能;支持个性化话参数配置(普通字符窜,JSON字符窜,数组窜)。
经过分析系统功能模块设计如下图2-1展示;
图2-1 参数中心系统功能模块图
三、技术需求分析
- 多系统多模式参数存储
- 支持安全验证
- 参数变更通知
- 高可用
- 低侵入
根据上述技术需求分析发现spring,zookeeper具备有这些特性,多系统多模式的参数存储与zookeeper的目录型存储方式相似,查看图3-1;支持安全验证与zookeeper的ACL安全配置吻合;参数变更通知与zookeeper的Watcher机制吻合;高可用与zookeeper集群部署方式相吻合;低侵入与spring的设计原则相吻合,结合spring的BeanFactoryPostProcessor扩展点实现与${}类似的便捷参数配置。
图3-1 基于zookeeper的参数存储
四、设计实现
技术组合:ZooKeeper集群 + ZooKeeper Java客户端 + Spring BeanFactoryPostProcessor扩展点 + JSON字符窜解析 + Spring SpEL表达式。
参考Spring的PropertyPlaceholderConfiguer实现与${}类似的配置方式zk{}配置,通过JSON解析提供多样化的参数配置,结合ZooKeeper Watcher机制与SpEL实现参数的实时维护,通过ZooKeeper ACL控制参数安全性。
五、使用方式
参考github项目 https://github.com/miasdz/ParamCenter
六、说明
本人技术有限,上述有错误的理解欢迎指出,共同交流学习。