mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-12-24 13:48:04 +08:00
5.2 KiB
5.2 KiB
插件系统
Monibuca 采用插件化架构设计,通过插件机制来扩展功能。插件系统是 Monibuca 的核心特性之一,它允许开发者以模块化的方式添加新功能,而不需要修改核心代码。
插件生命周期
插件系统具有完整的生命周期管理,主要包含以下阶段:
1. 注册阶段
插件通过 InstallPlugin 泛型函数进行注册,在此阶段会:
-
创建插件元数据(PluginMeta),包含:
- 插件名称:自动从插件结构体名称中提取(去除"Plugin"后缀)
- 插件版本:从调用者的文件路径或包路径中提取,如果无法提取则默认为"dev"
- 插件类型:通过反射获取插件结构体类型
-
注册可选功能:
- 退出处理器(OnExitHandler)
- 默认配置(DefaultYaml)
- 拉流器(Puller)
- 推流器(Pusher)
- 录制器(Recorder)
- 转换器(Transformer)
- 发布认证(AuthPublisher)
- 订阅认证(AuthSubscriber)
- gRPC服务(ServiceDesc)
- gRPC网关处理器(RegisterGRPCHandler)
-
将插件元数据添加到全局插件列表中
注册阶段是插件生命周期的第一个阶段,它为插件系统提供了插件的基本信息和功能定义,为后续的初始化和启动做准备。
2. 初始化阶段 (Init)
插件通过 Plugin.Init 方法进行初始化,此阶段包含以下步骤:
-
实例化检查
- 检查插件是否实现了 IPlugin 接口
- 通过反射获取插件实例
-
基础设置
- 设置插件元数据和服务器引用
- 配置插件日志记录器
- 设置插件名称和版本信息
-
环境检查
- 检查环境变量是否禁用插件(通过 {PLUGIN_NAME}_ENABLE=false)
- 检查全局禁用状态(DisableAll)
- 检查用户配置中的启用状态(enable)
-
配置加载
- 解析通用配置
- 加载默认YAML配置
- 合并用户配置
- 应用最终配置并记录
-
数据库初始化(如果需要)
- 检查数据库连接配置(DSN)
- 建立数据库连接
- 自动迁移数据库表结构(针对录制功能)
-
状态记录
- 记录插件版本
- 记录用户配置
- 设置日志级别
- 记录初始化状态
如果在初始化过程中发生错误:
- 插件将被标记为禁用状态
- 记录禁用原因
- 添加到已禁用插件列表
初始化阶段为插件的运行准备必要的环境和资源,是确保插件正常运行的关键阶段。
3. 启动阶段 (Start)
插件通过 Plugin.Start 方法启动,此阶段按顺序执行以下操作:
-
gRPC服务注册(如果配置)
- 注册gRPC服务
- 注册gRPC网关处理器
- 处理gRPC相关错误
-
插件管理
- 将插件添加到服务器的插件列表中
- 设置插件状态为运行中
-
网络监听初始化
- HTTP/HTTPS服务启动
- TCP/TLS服务启动(如果实现了ITCPPlugin接口)
- UDP服务启动(如果实现了IUDPPlugin接口)
- QUIC服务启动(如果实现了IQUICPlugin接口)
-
插件初始化回调
- 调用插件的OnInit方法
- 处理初始化错误
-
定时任务设置
- 配置服务器保活任务(如果启用)
- 设置其他定时任务
如果在启动过程中发生错误:
- 记录错误原因
- 将插件标记为禁用状态
- 停止后续启动步骤
启动阶段是插件开始提供服务的关键阶段,此时插件完成了所有准备工作,可以开始处理业务逻辑。
4. 停止阶段 (Stop)
插件的停止阶段通过 Plugin.OnStop 方法和相关的停止处理逻辑实现,主要包含以下步骤:
-
停止服务
- 停止所有网络服务(HTTP/HTTPS/TCP/UDP/QUIC)
- 关闭所有网络连接
- 停止处理新的请求
-
资源清理
- 停止所有定时任务
- 关闭数据库连接(如果有)
- 清理临时文件和缓存
-
状态处理
- 更新插件状态为已停止
- 从服务器的活动插件列表中移除
- 触发停止事件通知
-
回调处理
- 调用插件自定义的OnStop方法
- 执行注册的停止回调函数
- 处理停止过程中的错误
-
连接处理
- 等待当前请求处理完成
- 优雅关闭现有连接
- 拒绝新的连接请求
停止阶段的主要目标是确保插件能够安全、干净地停止运行,不影响系统的其他部分。
5. 销毁阶段 (Destroy)
插件的销毁阶段通过 Plugin.Dispose 方法实现,这是插件生命周期的最后阶段,主要包含以下步骤:
-
资源释放
- 调用插件的OnStop方法进行停止处理
- 从服务器的插件列表中移除
- 释放所有分配的系统资源
-
状态清理
- 清除插件的所有状态信息
- 重置插件的内部变量
- 清空插件的配置信息
-
连接断开
- 断开与其他插件的所有连接
- 清理插件间的依赖关系
- 移除事件监听器
-
数据清理
- 清理插件产生的临时数据
- 关闭并清理数据库连接
- 删除不再需要的文件
-
最终处理
- 执行注册的销毁回调函数
- 记录销毁日志
- 确保所有资源都被正确释放
销毁阶段的主要目标是确保插件完全清理所有资源,不留下任何残留状态,防止内存泄漏和资源泄露。