您好,欢迎来到上海分类信息网
免费发信息

基于ZooKeeper,Spring设计实现的参数系统

2024-5-24 18:41:41发布3次查看ip:发布人:
简介
基于zookeeper服务端、zookeeper java客户端以及spring框架设计的用于系统内部进行参数维护的系统。
设计背景
在我们日常开发的系统内部,开发过程中最常见的一项工作便是常用参数的维护,从我学习java以来,参数的配置多样化,最常见的方式是properties配置文件或者是xml配置文件,高深点的用法是jmx mbean进行参数管理以及数据库参数配置。我们对现有的参数配置方式进行分析,详见下表:
基于上述各类参数配置分析,一番思考设想,设计出如下结构的[参数中心系统](详细设计链接),设计说明查看下一节:
系统设计说明
参数中心系统,顾名思义,主要是将参数集中化,在实际开发中,一个业务的实现需要几个甚至数十个模块联合完成,每个模块都需要进行参数的更新维护,一个模块的参数更新设计缺陷,在进行参数维护时,就可能导致某个业务的中断,故需要将多参数管理统一化管理;统一化的参数管理方式,便可能涉及到了参数数据的统一存储,统一之后便出现了性能瓶颈需求,不然所有鸡蛋装一个篮子里,一出问题全部碎掉;在集中化后,各个模块有自己的参数,有些参数可能仅限单个系统访问,便需要安全的参数访问方式;在参数使用过程中,常见的功能之一便是参数的实时维护;在项目投产过程中,经常因为参数配置问题比如配置错误等情况导致业务中断,故需要一个参数检查表来确认参数的正确性;参数管理整合后,需要方便的操作来实现管理功能。概括一下,参数中心系统需要满足以下技术需求:
多系统、多模式、安全、动态维护的参数配置个性化话参数配置(普通字符窜,json字符窜,数组窜)低侵入快捷的参数导入导出功能便捷的管理方式上线参数检查表,用于上线时各类参数的检查,防止出错高可用安全控制根据上述分析,设计之初,思考如何实现多系统多模式的参数存储,虽然一直知道zookeeper这个东西,但从未详细了解过,偶然机会大致学习了一下zookeeper,发现zookeeper的各类机制与参数中心系统设计相吻合,比如:多系统多模式的参数存储与zookeeper的目录型存储方式相似,查看下面图3-1展示;参数的安全方式认证与zookeeper的acl机制吻合;参数实时维护可以借鉴zookeeper的watcher机制;参数中心系统的高性能高可用设计与zookeeper的集群方式相吻合。这样下来,参数中心系统最大的问题参数存储模块服务端得到了完美的解决。接下来的便是基于zookeeper设计出对应的客户端,管理端。
图3-1 基于zookeeper的参数存储
java应用端常用的技术之一便是spring框架,也符合低侵入的设计原则,在使用spring开发过程中,常用的功能之一便是使用${}引用properties配置文件内的参数,如此方便的参数配置方式,我决定使用类似的方式,配置方式为zk{}(zk表示zookeeper参数),故客户端的设计是基于spring的设计。
系统技术组合
zookeeper集群 + zookeeper java客户端 + spring beanfactorypostprocessor扩展点 + json字符窜解析 + spring spel表达式
设计实现(重点)
根据上述设计说明等信息,最后得出这样一个系统,基于zookeeper参数存储,spring客户端使用zk{}进行参数配置的参数中心系统。
服务端服务端设计如3-1图所示(在实际开发过程中可能稍有变动)
客户端(重点)在进行参数中心系统客户端实现之前,我们先了解一点spring框架的基础知识。
在spring框架开发过程中,最常用的配置是标签的使用,在工作中,最常听的一种说法是,在xml里配置上就可以使用bean了,就有对象了,这种理解潜在一层含义xml直接配置成了java bean,而实际上,spring中bean的定义最终表现为beandefinition对象,个人理解为xml实际配置的是bean的说明信息,spring将这些说明信息转换为了beandefinition对象,再由beandefinition生成了我们最终看到的bean,实际流程为[xml配置->beandefinition->bean]而一般开发者不知道beandefinition,故理解含义成了[xml配置->bean],中间缺少了重要的环节。在beandefinition到bean这个过程中,spring由beanfactory生成实际的bean,在实际bean产生前,spring提供了beanfactorypostprocessor扩展点(类似还有beanpostprocessor),通过该扩展点可以获取到配置的beandefinition信息,用于自定义扩展对bean定义变更修改,实现自由控制。
spring允许开发者实现自定义的扩展点,实现特定的接口,使用通用的配置即可注册一个扩展点到spring容器内。详细学习参考https://docs.spring.io/spring/docs/4.3.19.release/spring-framework-reference/htmlsingle/#beans-factory-nature。
参数中心系统参数的配置实现参考了spring的${}参数配置,我们对${}的实现做简单学习。${}的实现便使用了spring扩展点beanfactorypostprocessor,开发中常见配置如下:
上图中采用了context:property-placeholder标签配置,根据spring context的xsd说明文件,我们知道了property-placeholder对应的实际类为org.springframework.context.support.propertysourcesplaceholderconfigurer,context:property-placeholder配置实际为在spring容器内注册一个扩展点,实现${}表达式的解析。实现类图以及调用流程大致如下,再详细过程查看源码,(有句话叫做师傅领进门,修行在个人):
参数中心系统客户端的实现代码与上述实现类似,不同的是properties配置文件变成了zookeeper参数存储,${}变成了zk{}。
客户端项目名称:itwatertop-pczk-client
管理端基于h5的管理页面设计,详细情况还未设想(先实现了主要的服务端客户端,管理端暂时可以使用zookeeper的客户端)。
客户端设计源码
客户端程序结构如下:
文件说明:
baseloader.java 数据加载基类zookeeperdataloader.java java zookeeper客户端实现数据加载,参数更新回调。placeholdermsg.java zk{zkexp} zk配置表达式解析结果,以及使用该表达式的bean属性获取spel表达式。paramcenterstore.java 对zookeeper参数服务端获取的参数信息做缓存,并且将对应的使用该参数的bean属性表达式统计,方便zookeeper参数变更时回调使用。pczkconstants.java 系统内常量字符窜整合。pczkstringvalueresolver.java 表达式解析统一接口pczkpropertyplaceholderconfiguer.java 实现spring扩展点beanfactorypostprocessor,通过该扩展点对beandefinition配置元信息做解析以及变更。propertyplaceholderhelper.java 具体实现zk{}表达式解析规则。pczkbeandefinitionvisitor.java 对spring ioc容器内的beandefinition属性配置信息做解析,主要结合pczkpropertyplaceholderconfiguer.java使用。test目录下包含一部分测试代码,可以自行查看客户端代码实现简介:
根据上述需求,客户端代码需要具备的能力包括:
与zookeeper服务器的连通,并获取参数信息spring xml中zk{}表达式的解析多样化的参数配置,支持字符窜,对象,数组zookeeper参数变更回调,维护参数信息针对上面4种要求,在开发时使用以下解决办法:
使用zookeeper java客户端;结合spring的扩展点beanfactorypostprocessor;在zookeeper服务端节点内设置数据时设置字符窜/json对象字符窜或者是json数组字符窜,客户端使用数据时分别配置为zk{param},zk{param.key},zk{param[i]},通过对zk{}表达式解析判断zookeeper参数格式,若为json字符窜使用fastjson对字符窜做解析,访问对应属性值;针对参数变更回调,在解析zk{}表达式时拼接出了可以访问到对应bean属性的spel表达式,通过spel表达式访问bean属性调用setter方法,因此属性操作也受到spel表达式的限制。在个别情况下,由于参数的变更可能需要别的一下操作处理,比如重新建立连接,这个可以自行扩展代码,比如比较上一次的值和当前值是否一致,不一致做出新的操作(现在也在设想怎么可以自动识别进行额外操作)。客户端详细实现源码下载:访问github项目(注释还是比较清晰的)
说明
本人技术有限,上述有错误的理解欢迎指出,共同交流学习,若对上述说明不了解,建议先学习一点spring ioc设计,学习地址:https://docs.spring.io/spring/docs/4.3.19.release/spring-framework-reference/htmlsingle,若对于客户端的设计有好的建议可以提出来,共同讨论。
该用户其它信息

VIP推荐

上海分类信息网-上海免费发布信息-上海新闻网