1. 概述
KivaKit 是一个模块化 Java 应用框架,旨在加速简化微服务和应用程序开发。它由 Telenav 自 2011 年起开发维护,现已作为 Apache 许可的开源项目在 GitHub 上发布。
本文将探索 KivaKit 的设计理念——由多个协同工作的"迷你框架"组成,并深入解析每个迷你框架的核心特性。
2. KivaKit 迷你框架体系
在 kivakit 和 kivakit-extensions 仓库中,KivaKit 1.0 包含 54 个模块。乍看可能令人望而生畏,但拆解后其实很清晰:每个模块均可独立使用,开发者可按需引入。
部分 KivaKit 模块包含迷你框架。迷你框架是解决通用问题的简单抽象设计。这些框架具有直观且广泛适用的接口,如同乐高积木般可灵活组合:
迷你框架 | 模块 | 描述 |
---|---|---|
Application | kivakit-application | 应用和服务基础组件 |
Command-Line Parsing | kivakit-commandline | 基于转换/验证框架的开关参数解析 |
Component | kivakit-component | KivaKit 组件(含应用)基础功能 |
Conversion | kivakit-kernel | 鲁棒模块化类型转换器抽象 |
Extraction | kivakit-kernel | 数据源对象提取 |
Interfaces | kivakit-kernel | 框架集成通用接口 |
Logging | kivakit-kernel kivakit-logs-* | 日志核心/SPI/实现 |
Messaging | kivakit-kernel | 组件状态信息传输 |
Mixins | kivakit-kernel | 有状态 traits 实现 |
Resource | kivakit-resource kivakit-network-* kivakit-filesystems-* | 文件/文件夹/流资源抽象 |
Service Locator | kivakit-configuration | 服务定位模式 实现 |
Settings | kivakit-configuration | 组件配置信息便捷访问 |
Validation | kivakit-kernel | 对象一致性校验基础功能 |
核心框架位于 kivakit 仓库,服务提供者等次要模块则位于 kivakit-extensions。
2.1 消息机制
如架构图所示,消息机制是核心集成点。KivaKit 通过消息机制规范化状态报告。Java 开发者习惯用日志记录状态信息,有时也返回给调用方或作为异常抛出。而 KivaKit 将状态信息封装在 Messages 中,组件可广播或监听这些消息。
这种设计让组件专注于状态报告的一致性,无需关心消息去向(日志/统计/终端显示)。广播消息的组件可连接多个消息中继器形成监听链:
通常 Application 作为监听链终点,负责记录所有消息。链中组件可按需处理消息。
2.2 混入机制
KivaKit 另一集成特性是混入(Mixins)迷你框架。KivaKit 混入允许基类通过接口继承混入到类型中,也称"有状态 traits"。
例如 BaseComponent 提供构建组件的基础功能(消息发送/资源访问等)。但 Java 单继承限制导致已有基类的类无法扩展 BaseComponent。混入机制解决了这个问题:
public class MyComponent extends MyBaseClass implements ComponentMixin { [...] }
ComponentMixin 接口同时继承 Mixin 和 Component:
Mixin 提供 state() 方法创建关联 BaseComponent,ComponentMixin 通过默认方法委托给 BaseComponent,实现与继承相同的功能。
2.3 服务定位器
服务定位器 Registry 实现组件间连接。Registry 提供与依赖注入(DI)类似的功能,但关键区别在于:服务定位模式由组件主动获取所需接口,而 DI 是被动注入。这种设计提升了封装性并缩小引用范围,例如:
class MyData extends BaseComponent {
[...]
public void save() {
var database = require(Database.class);
database.save(this);
}
}
BaseComponent.require(Class) 在 Registry 中查找对象。方法返回时 database 引用即失效,防止外部代码获取引用。
应用启动时可通过 BaseComponent.registerObject() 注册服务对象,其他代码通过 require(Class) 查找使用。
2.4 资源与文件系统
kivakit-resource 模块提供流式资源读写和文件系统访问抽象。重要资源类型包括:
- 文件(本地/Zip/S3/HDFS)
- 包资源
- 网络协议(Socket/HTTP/HTTPS/FTP)
- 输入输出流
该抽象带来两大优势:
- 通过一致的面向对象 API 访问任意流式资源
- 使用 Resource 和 WritableResource 接口支持未知资源类型
2.5 组件
kivakit-component 模块提供通用功能:
- 消息收发
- 包及包资源访问
- 对象/组件/设置注册与查找
Component 接口由 BaseComponent 和 ComponentMixin 实现,可为任意对象添加"组件特性"。
2.6 日志
KivaKit 组件形成的监听链通常终止于 Logger。Logger 将消息写入一个或多个 Log,kivakit-kernel 提供 Log 实现的 SPI。
基于该 SPI,kivakit-extensions 提供多种 Log 实现:
提供者 | 模块 |
---|---|
ConsoleLog | kivakit-kernel |
FileLog | kivakit-logs-file |
EmailLog | kivakit-logs-email |
可通过命令行配置 KIVAKIT_LOG 系统属性选择日志实现。
2.7 转换与验证
kivakit-kernel 模块包含类型转换和对象验证迷你框架。这些框架与消息机制集成,确保问题报告一致性并简化使用。实现如 StringConverter 等转换器时,只需编写转换逻辑,无需处理异常/空字符串/空值。
转换器应用场景包括:
- 开关参数解析
- 属性文件加载设置对象
- 对象调试字符串格式化
- CSV 文件对象读取
验证框架捕获 Validatable 广播的消息,提供错误统计和验证问题分析:
2.8 应用/命令行/设置
*kivakit-application、*kivakit-configuration 和 kivakit-commandline 模块提供应用开发的一致模型**。
kivakit-application 提供 Application 基类(继承 Component),通过 kivakit-configuration 提供设置,通过 kivakit-commandline 解析命令行。
kivakit-configuration 使用 kivakit-resource 从 .properties 资源加载设置,通过 kivakit-kernel 转换器转换为对象,再用验证框架校验。
命令行解析使用 KivaKit 转换器和验证器,问题在应用的 ConsoleLog 中可见:
2.9 微服务
除通用功能外,KivaKit 在 kivakit-extensions 中提供微服务专用功能。以 kivakit-web 为例:
kivakit-web 提供快速构建 REST 和 Web 接口的模块。JettyServer 类简化 Servlet 和 Filter 插入,支持插件包括:
插件 | 描述 |
---|---|
JettyJersey | REST 应用支持 |
JettySwagger | Swagger 自动 REST 文档 |
JettyWicket | Apache Wicket Web 框架支持 |
组合插件可构建带 Swagger 文档和 Web 界面的 REST 微服务:
var application = new MyRestApplication();
listenTo(new JettyServer())
.port(8080)
.add("/*", new JettyWicket(MyWebApplication.class))
.add("/open-api/*", new JettySwaggerOpenApi(application))
.add("/docs/*", new JettySwaggerIndex(port))
.add("/webapp/*", new JettySwaggerStaticResources())
.add("/webjar/*", new JettySwaggerWebJar(application))
.add("/*", new JettyJersey(application))
.start();
KivaKit 1.1 将推出专用微服务迷你框架,进一步简化开发。
3. 文档与 Lexakai
KivaKit 文档由 Lexakai 生成。Lexakai 创建 UML 图(可由注解引导)并更新 README.md 文件。它维护标准页眉页脚、UML 图索引和 Javadoc 文档索引。Lexakai 是 Apache 许可的开源项目。
4. 构建 KivaKit
KivaKit 目标 Java 11+ 虚拟机(但源码兼容 Java 8)。所有模块制品可在 Maven Central 获取。如需修改或贡献,需自行构建。
准备环境:
克隆仓库:
mkdir ~/Workspace
cd ~/Workspace
git clone --branch develop https://github.com/Telenav/kivakit.git
复制配置文件:
cp kivakit/setup/profile ~/.profile
修改 ~/.profile 指定工作区和工具路径:
export KIVAKIT_WORKSPACE=$HOME/Workspace
export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-16.jdk/Contents/Home
export M2_HOME=$HOME/Developer/apache-maven-3.8.2
确保使用 bash(macOS 默认为 zsh):
chsh -s /bin/bash
重启终端后执行:
$KIVAKIT_HOME/setup/setup.sh
该脚本将克隆 kivakit-extensions 等相关仓库,初始化 git-flow 并构建所有项目。
5. 总结
本文简要解析了 KivaKit 的设计理念和核心功能。KivaKit 特别适合微服务开发,其模块化设计允许开发者按需学习使用独立组件,简单粗暴地提升开发效率。