1. 概述

KivaKit 是一个模块化 Java 应用框架,旨在加速简化微服务和应用程序开发。它由 Telenav 自 2011 年起开发维护,现已作为 Apache 许可的开源项目在 GitHub 上发布。

本文将探索 KivaKit 的设计理念——由多个协同工作的"迷你框架"组成,并深入解析每个迷你框架的核心特性。

2. KivaKit 迷你框架体系

kivakitkivakit-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 接口同时继承 MixinComponent

混入机制图解

Mixin 提供 state() 方法创建关联 BaseComponentComponentMixin 通过默认方法委托给 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 访问任意流式资源
  • 使用 ResourceWritableResource 接口支持未知资源类型

2.5 组件

kivakit-component 模块提供通用功能:

  • 消息收发
  • 包及包资源访问
  • 对象/组件/设置注册与查找

Component 接口由 BaseComponentComponentMixin 实现,可为任意对象添加"组件特性"。

2.6 日志

KivaKit 组件形成的监听链通常终止于 LoggerLogger 将消息写入一个或多个 Logkivakit-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-configurationkivakit-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 特别适合微服务开发,其模块化设计允许开发者按需学习使用独立组件,简单粗暴地提升开发效率。


原始标题:Introducing KivaKit | Baeldung