Go插件系统
这是一个基于Go语言的动态插件系统,支持热插拔和动态加载插件。系统提供了一个统一的插件接口和管理框架,使开发者能够轻松地开发和集成新的插件。
功能特点
- 支持动态加载和卸载插件
- 提供统一的插件接口和基础实现
- 支持插件配置管理
- 提供Web管理界面
- 支持插件操作的动态发现和执行
- 内置完整的错误处理和日志记录
- 支持插件状态管理和生命周期控制
系统架构
核心组件
-
插件接口 (
interface.go
)- 定义了插件必须实现的基本接口
- 包含生命周期管理方法
- 定义了插件操作和配置接口
-
基础插件 (
plugin.go
)- 提供插件接口的默认实现
- 包含插件管理器的核心功能
- 处理插件的加载、启动、停止和卸载
-
Web管理界面 (
admin/
)- 提供插件的可视化管理
- 支持插件配置修改
- 允许执行插件操作
快速开始
1. 创建新插件
要创建一个新插件,需要实现 IPlugin
接口。推荐使用 BasePlugin
作为基础结构:
package main
import (
"context"
"plugins"
)
type MyPlugin struct {
*plugins.BasePlugin
// 添加插件特定的字段
}
var Plugin = &MyPlugin{
BasePlugin: plugins.NewBasePluginWithDefaultType(
"MyPlugin", // 插件名称
"1.0.0", // 版本
"插件描述", // 描述
"开发者", // 作者
),
}
2. 实现必要的接口方法
// 初始化插件
func (p *MyPlugin) Init(ctx context.Context, config map[string]interface{}) error {
// 初始化逻辑
return nil
}
// 启动插件
func (p *MyPlugin) Start(ctx context.Context) error {
// 启动逻辑
return nil
}
// 停止插件
func (p *MyPlugin) Stop(ctx context.Context) error {
// 停止逻辑
return nil
}
3. 实现插件操作
// 定义插件支持的操作
func (p *MyPlugin) GetOperationInfo(operation string) (*plugins.OperationInfo, error) {
switch operation {
case "myOperation":
return &plugins.OperationInfo{
Name: "myOperation",
Description: "操作描述",
Params: []plugins.OperationParamInfo{
{
Name: "param1",
Type: "string",
Required: true,
Description: "参数描述",
},
},
}, nil
default:
return nil, fmt.Errorf("不支持的操作: %s", operation)
}
}
// 实现操作执行逻辑
func (p *MyPlugin) Execute(ctx context.Context, action string, params map[string]interface{}) (interface{}, error) {
switch action {
case "myOperation":
// 实现操作逻辑
return map[string]interface{}{"result": "success"}, nil
default:
return nil, fmt.Errorf("不支持的操作: %s", action)
}
}
插件开发指南
1. 插件结构
每个插件必须:
- 实现
IPlugin
接口 - 导出名为
Plugin
的变量 - 包含
main
函数(虽然不会被调用)
2. 配置管理
插件配置通过 Init
方法传入,建议在插件中定义配置结构:
type Config struct {
Option1 string `json:"option1"`
Option2 int `json:"option2"`
}
func (p *MyPlugin) Init(ctx context.Context, config map[string]interface{}) error {
// 解析配置
// 处理配置项
return nil
}
3. 错误处理
- 所有错误应该返回有意义的错误信息
- 使用
fmt.Errorf
格式化错误信息 - 在适当的地方记录错误日志
4. 生命周期管理
插件的生命周期包括:
- 加载(Load)
- 初始化(Init)
- 启动(Start)
- 运行(Running)
- 停止(Stop)
- 卸载(Unload)
确保在每个阶段都正确处理资源。
示例插件
默认日志插件
参考 plugins/defaultlogger/default_logger_plugin.go
作为完整的插件实现示例:
- 实现了基本的日志记录功能
- 支持文件和控制台输出
- 提供了多个操作接口
- 包含完整的配置管理
构建和部署
1. 构建插件
使用提供的构建脚本:
./build_all.sh
这将编译所有插件并将它们放置在正确的目录中。
2. 配置插件
在 plugins.json
中配置插件:
{
"MyPlugin": {
"enabled": true,
"config": {
"option1": "value1",
"option2": 123
}
}
}
3. 启动管理界面
cd admin
./web_admin_new
API接口
1. 插件管理
GET /plugins
- 获取所有插件列表POST /plugin/enable
- 启用插件POST /plugin/disable
- 禁用插件POST /plugin/config
- 更新插件配置
2. 插件操作
POST /api/execute
- 执行插件操作
请求示例:
{
"plugin": "MyPlugin",
"operation": "myOperation",
"params": {
"param1": "value1"
}
}
最佳实践
-
模块化设计
- 将功能划分为独立的模块
- 避免插件间的直接依赖
-
错误处理
- 提供详细的错误信息
- 实现优雅的错误恢复机制
-
资源管理
- 正确处理资源的分配和释放
- 在插件停止时清理所有资源
-
配置验证
- 在初始化时验证所有配置项
- 提供合理的默认值
-
文档
- 详细记录插件的功能和用法
- 提供配置项的说明
- 包含示例代码
故障排除
-
插件加载失败
- 检查插件文件权限
- 验证插件接口实现
- 查看系统日志
-
操作执行失败
- 检查参数格式
- 验证插件状态
- 查看插件日志
贡献指南
- Fork 项目
- 创建特性分支
- 提交变更
- 推送到分支
- 创建 Pull Request
许可证
[添加许可证信息]
Description
Languages
Go
80.8%
HTML
17.6%
Shell
1.6%