基于ZooKeeper服务端、ZooKeeper Java客户端以及Spring框架设计的用于系统内部进行参数维护的系统。
二、设计背景
在我们日常开发的系统内部,开发过程中最常见的一项工作便是常用参数的维护,从我学习Java以来,参数的配置多样化,最常见的方式是properties配置文件或者是xml配置文件,高深点的用法是JMX MBean进行参数管理以及数据库参数配置。我们对现有的参数配置方式进行分析,详见下表:
配置方式 常见问题 备注代码内字符窜字面量配置 每次参数的修改都需要重新编译
properties配置文件/xml配置文件 普通用法虽然将参数从代码内抽离出来,但是无法随时更新生效 Spring提供的ReloadableResourceBundleMessageSource工具类可以实现热加载Properties文件,将参数配置文件从代码分离可以做到不停机不重启做参数维护,并被程序加载,但是仍需系统重新从文件资源内获取新的参数值
JMX参数配置 标准MBEAN是有侵入性的,他要管理的对象是符合JAVA BEAN规范的对象。但是要作为标准MBEAN而被管理,就需要实现一个接口。这个接口的名称必须是类名加上MBean。 Spring支持将普通Bean通过配置MBeanExporter生成MBean
数据库参数配置 需要从数据库内加载参数,每次参数的使用需要连接数据库进行数据库查询。后来出现了代码缓存数据库参数,在一次使用后将参数信息放置缓存内,但是这种做法无法感知数据库参数的变化。 代码缓存数据库参数方式,可以新增代码设计用于刷新缓存参数,从库内重新读取放置缓存内,也不失为一种方便的参数管理。
基于上述各类参数配置分析,一番思考设想,设计出如下结构的[参数中心系统](详细设计链接),设计说明查看下一节:
三、系统设计说明
参数中心系统,顾名思义,主要是将参数集中化,在实际开发中,一个业务的实现需要几个甚至数十个模块联合完成,每个模块都需要进行参数的更新维护,一个模块的参数更新设计缺陷,在进行参数维护时,就可能导致某个业务的中断,故需要将多参数管理统一化管理;统一化的参数管理方式,便可能涉及到了参数数据的统一存储,统一之后便出现了性能瓶颈需求,不然所有鸡蛋装一个篮子里,一出问题全部碎掉;在集中化后,各个模块有自己的参数,有些参数可能仅限单个系统访问,便需要安全的参数访问方式;在参数使用过程中,常见的功能之一便是参数的实时维护;在项目投产过程中,经常因为参数配置问题比如配置错误等情况导致业务中断,故需要一个参数检查表来确认参数的正确性;参数管理整合后,需要方便的操作来实现管理功能。概括一下,参数中心系统需要满足以下技术需求:
多系统、多模式、安全、动态维护的参数配置
个性化话参数配置(普通字符窜,JSON字符窜,数组窜)
低侵入
快捷的参数导入导出功能
便捷的管理方式
上线参数检查表,用于上线时各类参数的检查,防止出错
高可用
安全控制
根据上述分析,设计之初,思考如何实现多系统多模式的参数存储,虽然一直知道ZooKeeper这个东西,但从未详细了解过,偶然机会大致学习了一下ZooKeeper,发现ZooKeeper的各类机制与参数中心系统设计相吻合,比如:多系统多模式的参数存储与ZooKeeper的目录型存储方式相似,查看下面图3-1展示;参数的安全方式认证与ZooKeeper的ACL机制吻合;参数实时维护可以借鉴ZooKeeper的Watcher机制;参数中心系统的高性能高可用设计与ZooKeeper的集群方式相吻合。这样下来,参数中心系统最大的问题参数存储模块服务端得到了完美的解决。接下来的便是基于ZooKeeper设计出对应的客户端,管理端。
图3-1 基于ZooKeeper的参数存储