elastic-job-lite 是公司使用的一款定时任务调度框架,该框架将全部的任务调度信息都注册进了 zookeeper 中。git
为了方便定位相关的问题,我去网上搜了 zookeeper 相关的图形化客户端,结果没有一款符合本身的需求,因而就干脆本身写一个算了。github
该客户端是去年国庆假期写的,经历了从 Java8 到 Java11 的重构(主要是模块化),该文章主要是对整个过程的一个回顾web
面向用户:zookeeper 用户apache
软件名称:PrettyZoo架构
功能:框架
交互与原型:编辑器
交互分两部,第一步启动页面要求用户输入 zookeeper 的服务地址,链接成功后会跳到节点操做页面模块化
技术方案:工具
最终实现:布局
不足:
重构主要是为了解决上一版的不足,而第一步就是分析产生这些问题的根本缘由,再提出对应的解决方案
一次只能管理一个 server
这是由于交互和设计上致使的,要解决该问题须要从新思考交互和软件的布局。
通过网上的调研,最终决定采用 “三栏布局”,即解决了之前交互模式的分割感,又知足了一次性管理多个 server 的需求。
须要额外安装 JRE
既然选择了 Java 做为开发语言,那么程序必然会依赖 JRE 来运行。此时再切换语言天然是不现实的,好在 Java9 的 模块化系统
(Jigsaw)提供了另外一个选择,细节就不在此深刻讨论了。
总之就是模块化改造之后,最终打包出来的程序不须要安装额外的 JRE 也能够运行,由于打包出来的程序已经提供了运行时须要的最小依赖集合。
因为最新的 JDK LTS 版本是 11,因此跳过 9 和 10,直接升级到 Java11
颜值不足
初版的 UI 采用的是 Java Swing 技术, 相对来讲过于沉重,干脆就将 UI 框架切换到了 JavaFX.
JavaFX 是下一代的 Java 客户端技术,能够经过 CSS 来调整软件的总体样式,并且 JavaFX 对还支持数据绑定。
分层架构致使的模块边界不清晰
架构的改造对用户的感知几乎没有,但依然是一个重中之重的事情,由于随着功能的增长,每次改动的成本也会成倍的增长,最终可能致使该软件没法维护下去。
架构的总体框架依然是分层,不过加入了 SPI
层用于反转层与层之间的依赖关系,能够参见下图
这样就将传统的自上而下的依赖关系改为了一个插件式的架构。
模块的依赖入下图
再说一个额外的问题,不少时候服务端的 zookeeper 在内网,是不能直连的,而为了应对这样的场景,此次改造也加入了 SSH 隧道的功能。
整个软件重构的难点在于从 Java8 迁移到 Java11 的模块化平台,由于 Java 的模块化平台并非兼容的,不少依赖的库还不支持模块化。
而打包用的工具 Jlink 是只支持标准模块的,为了将第三库转为标准模块就须要用到构建插件(推荐 https://badass-jlink-plugin.beryx.org/releases/latest/)
最终重构完成后,打包出来的软件接近 60M,不须要安装 Java 运行环境就能够运行,仍是至关满意的。
下图展现了布局和交互
该软件最终的成品我开源在了 Github上,详情点击 https://github.com/vran-dev/PrettyZoo,欢迎 star 和 issue。
实际的体验下来, Java 的模块系统仍是挺不错的,JavaFX 配合模块化尤为适用于桌面客户端,奈何如今已是移动互联网的天下了......
本文使用 mdnice 排版