Common
Common
概述
io.github.sinri.drydock.common
包是 DryDock 项目的核心公共模块,提供了通用的基础设施组件和混入接口。该模块为所有其他模块提供了统一的基础能力,包括日志记录、健康监控、HTTP服务器、队列处理、定时任务等核心功能。
核心接口
CommonUnit
CommonUnit
是整个模块的基础接口,定义了所有单元都应该具备的通用能力:
- 日志记录中心: 提供
KeelIssueRecordCenter
用于统一的日志管理 - 问题记录器: 支持创建不同主题的
KeelIssueRecorder
实例 - 指标记录器: 提供
KeelMetricRecorder
用于性能指标记录
混入接口 (Mixin Interfaces)
HttpServerMixin
HTTP服务器混入接口,为实现类提供Web服务能力:
- 服务器构建:
buildHttpServer()
方法创建KeelHttpServer
实例 - 端口配置:
configuredHttpServerPort()
配置监听端口(默认8080) - 路由配置:
configureHttpServerRoutes(Router router, KeelIssueRecorder<KeelEventLog> httpServerLogger)
配置路由规则 - 生命周期管理: 支持启动前回调
beforeStartHttpServer()
和停止声明stopServer()
- 异步加载:
loadHttpServer()
异步启动HTTP服务
QueueMixin
队列处理混入接口,提供异步任务队列功能:
- 队列构建:
buildQueue()
创建KeelQueue
实例 - 工作池管理:
configuredQueueWorkerPoolSize()
配置工作线程池大小 - 信号读取:
readSignal(KeelIssueRecorder<QueueManageIssueRecord> queueManageIssueRecorder)
读取队列信号 - 任务查找:
seekNextTask(KeelIssueRecorder<QueueManageIssueRecord> queueManageIssueRecorder)
查找下一个待处理任务 - 异步加载:
loadQueue()
以Worker线程模式部署队列服务 - 预加载钩子:
beforeLoadingQueue()
清理遗留任务
SundialMixin
定时任务混入接口,提供日晷(Sundial)定时调度功能:
- 日晷构建:
buildSundial()
创建KeelSundial
实例 - 计划获取:
fetchSundialPlans(KeelIssueRecorder<SundialIssueRecord> sundialIssueRecorder)
异步获取定时计划 - 异步加载:
loadSundial()
以Worker线程模式部署定时服务
HealthMonitorMixin
健康监控混入接口,提供系统健康状态监控:
- 监控器构建:
buildHealthMonitor()
创建健康监控实例,默认返回HealthMonitorWithIssueRecorder
- 异步加载:
loadHealthMonitor()
以Worker线程模式部署监控服务
子模块
health 子包
健康监控相关组件:
- HealthMonitor: 抽象的健康监控基类,提供系统运行时监控
- HealthMonitorWithIssueRecorder: 基于问题记录器的健康监控实现
- HealthMonitorWithMetricRecorder: 基于指标记录器的健康监控实现
- HealthMonitorMixin: 健康监控混入接口
特性:
- 支持自定义监控间隔(默认60秒)
- 集成运行时监控器
KeelRuntimeMonitor
- 提供可扩展的监控项和记录处理
- 抽象方法:
prepare()
,createDraft()
,moreMonitorItems()
,handleRecord()
参见 健康监控。
baiyatan 子包
远程配置加载组件:
- BaiyatanConfigurationLoader: 基于 Kumori-Baiyatan 协议的远程配置加载器
功能:
- 支持从远程服务加载配置文件
- 使用MD5校验确保安全性
- 支持多层级作用域配置
- 自动集成到 Keel 配置系统
logging 子包
日志记录相关组件:
- DryDockLogTopics: 定义标准日志主题常量
TopicDryDock
: DryDock主题TopicSundial
: 日晷主题TopicHttpServer
: HTTP服务器主题
参见 日志记录。
logging.issue 子包
问题记录相关:
- HealthMonitorIssueRecord: 健康监控问题记录,包含快照属性
logging.metric 子包
指标记录相关组件:
- HealthMonitorMetricRecord: 健康监控指标记录
设计模式
混入模式 (Mixin Pattern)
该模块大量使用混入模式,通过接口提供可组合的功能模块:
public class MyService implements CommonUnit, HttpServerMixin, QueueMixin {
// 自动获得HTTP服务器和队列处理能力
}
模板方法模式
抽象类如 HealthMonitor
使用模板方法模式,定义算法框架,允许子类自定义具体实现:
prepare()
: 初始化准备createDraft()
: 创建草稿对象moreMonitorItems()
: 添加更多监控项handleRecord()
: 处理记录
集成与依赖
该模块依赖于以下核心库:
- Keel: 提供基础的垂直化、配置、日志等能力
- Vert.x: 提供异步编程和HTTP服务器支持
- javax.annotation: 提供注解支持
使用示例
创建带有多种能力的服务
public class MyApplicationService implements CommonUnit,
HttpServerMixin,
QueueMixin,
SundialMixin,
HealthMonitorMixin {
@Override
public void configureHttpServerRoutes(Router router, KeelIssueRecorder<KeelEventLog> httpServerLogger) {
router.get("/health").handler(ctx -> ctx.response().end("OK"));
}
@Override
public Future<KeelQueueSignal> readSignal(KeelIssueRecorder<QueueManageIssueRecord> queueManageIssueRecorder) {
// 实现信号读取逻辑
return Future.succeededFuture(null);
}
@Override
public Future<KeelQueueTask> seekNextTask(KeelIssueRecorder<QueueManageIssueRecord> queueManageIssueRecorder) {
// 实现任务查找逻辑
return Future.succeededFuture(null);
}
@Override
public Future<Collection<KeelSundialPlan>> fetchSundialPlans(KeelIssueRecorder<SundialIssueRecord> sundialIssueRecorder) {
// 实现定时计划获取逻辑
return Future.succeededFuture(Collections.emptyList());
}
@Override
public Future<Void> beforeStartHttpServer() {
// HTTP服务器启动前的处理
return Future.succeededFuture();
}
}
版本历史
- 1.0.0: 初始版本,提供基础的CommonUnit接口
- 1.1.0: 增加QueueMixin和SundialMixin
- 1.3.4: 优化IssueRecordCenter集成
- 1.4.0: 重构HealthMonitor为抽象类
- 1.4.9: 增加BaiyatanConfigurationLoader
- 2.0.3: 更新日志记录接口,标记部分方法为弃用
- 2.0.4: 增加更多日志记录器参数支持
- 2.0.5: 优化队列处理接口
注意事项
- 生命周期管理: 所有混入接口都提供了异步的
load*()
方法,应该在应用启动时调用 - 线程模型: 队列和定时任务默认使用Worker线程模型,HTTP服务器使用事件循环线程
- 配置管理: BaiyatanConfigurationLoader需要配置相应的Kumori服务参数
- 日志集成: 所有组件都集成了统一的日志记录体系,支持不同的适配器实现
- 方法签名: 自2.0.4版本起,多个混入接口的方法增加了日志记录器参数,提供更好的日志追踪能力