增强插件系统:优化插件管理和动态插件实现
- 在插件管理器中引入 DynamicPlugin 结构体,支持动态加载和管理插件,提升插件的灵活性和可扩展性。 - 更新插件接口,添加插件名称、版本、描述、作者、类型和启用状态的获取和设置方法,增强插件信息的管理能力。 - 修改现有插件实现,确保兼容新的动态插件结构,提升插件的统一性和可维护性。 - 更新示例程序,展示如何使用新的动态插件功能,提升用户体验。 此更新提升了插件系统的灵活性和可扩展性,便于开发者更好地管理和使用插件功能。
This commit is contained in:
12
examples/plugin/plugins/build.sh
Normal file → Executable file
12
examples/plugin/plugins/build.sh
Normal file → Executable file
@@ -3,14 +3,14 @@
|
||||
# 构建脚本,用于编译所有插件
|
||||
|
||||
# 确保输出目录存在
|
||||
mkdir -p dist
|
||||
mkdir -p ../../admin/plugins
|
||||
|
||||
echo "===== 开始编译插件 ====="
|
||||
|
||||
# 编译带有明确类型的日志插件
|
||||
echo "编译日志插件 (明确类型)..."
|
||||
cd logger
|
||||
go build -buildmode=plugin -o ../dist/logger.so
|
||||
go build -buildmode=plugin -ldflags "-s -w" -o ../../admin/plugins/logger.so
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "日志插件编译成功!"
|
||||
else
|
||||
@@ -22,7 +22,7 @@ cd ..
|
||||
# 编译使用默认类型的日志插件
|
||||
echo "编译默认日志插件 (默认类型)..."
|
||||
cd defaultlogger
|
||||
go build -buildmode=plugin -o ../dist/defaultlogger.so
|
||||
go build -buildmode=plugin -ldflags "-s -w" -o ../../admin/plugins/defaultlogger.so
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "默认日志插件编译成功!"
|
||||
else
|
||||
@@ -34,7 +34,7 @@ cd ..
|
||||
# 编译统计插件
|
||||
echo "编译统计插件..."
|
||||
cd stats
|
||||
go build -buildmode=plugin -o ../dist/stats.so
|
||||
go build -buildmode=plugin -ldflags "-s -w" -o ../../admin/plugins/stats.so
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "统计插件编译成功!"
|
||||
else
|
||||
@@ -46,7 +46,7 @@ cd ..
|
||||
# 编译存储插件
|
||||
echo "编译存储插件..."
|
||||
cd storage
|
||||
go build -buildmode=plugin -o ../dist/storage.so
|
||||
go build -buildmode=plugin -ldflags "-s -w" -o ../../admin/plugins/storage.so
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "存储插件编译成功!"
|
||||
else
|
||||
@@ -56,8 +56,6 @@ fi
|
||||
cd ..
|
||||
|
||||
echo "===== 所有插件编译完成 ====="
|
||||
echo "插件文件保存在 dist 目录中:"
|
||||
ls -la dist/
|
||||
|
||||
# 对于Windows系统,添加.exe后缀
|
||||
# go build -buildmode=plugin -o ../dist/plugin_name.dll
|
@@ -14,22 +14,73 @@ import (
|
||||
// DefaultLoggerPlugin 默认日志插件
|
||||
// 提供文件日志和控制台日志功能,使用默认插件类型
|
||||
type DefaultLoggerPlugin struct {
|
||||
*plugin.BasePlugin // 嵌入基本插件结构
|
||||
logFile *os.File // 日志文件
|
||||
logger *log.Logger // 日志记录器
|
||||
config map[string]interface{} // 配置
|
||||
plugin.Plugin // 嵌入接口,确保类型检查
|
||||
name string // 插件名称
|
||||
version string // 插件版本
|
||||
description string // 插件描述
|
||||
author string // 插件作者
|
||||
pluginType plugin.PluginType // 插件类型
|
||||
enabled bool // 是否启用
|
||||
logFile *os.File // 日志文件
|
||||
logger *log.Logger // 日志记录器
|
||||
config map[string]interface{} // 配置
|
||||
}
|
||||
|
||||
// Plugin 导出的插件变量
|
||||
// 注意:变量名必须是Plugin,大小写敏感
|
||||
// 这个插件使用默认的通用插件类型(PluginTypeGeneral)
|
||||
var Plugin = &DefaultLoggerPlugin{
|
||||
BasePlugin: plugin.NewBasePluginWithDefaultType(
|
||||
"DefaultLoggerPlugin",
|
||||
"1.0.0",
|
||||
"使用默认通用类型的日志记录插件",
|
||||
"开发者",
|
||||
), // 将自动使用 PluginTypeGeneral 类型
|
||||
name: "DefaultLoggerPlugin",
|
||||
version: "1.0.0",
|
||||
description: "使用默认通用类型的日志记录插件",
|
||||
author: "开发者",
|
||||
pluginType: plugin.PluginTypeGeneral, // 使用通用插件类型
|
||||
enabled: true,
|
||||
}
|
||||
|
||||
// Name 返回插件名称
|
||||
func (p *DefaultLoggerPlugin) Name() string {
|
||||
return p.name
|
||||
}
|
||||
|
||||
// Version 返回插件版本
|
||||
func (p *DefaultLoggerPlugin) Version() string {
|
||||
return p.version
|
||||
}
|
||||
|
||||
// Description 返回插件描述
|
||||
func (p *DefaultLoggerPlugin) Description() string {
|
||||
return p.description
|
||||
}
|
||||
|
||||
// Author 返回插件作者
|
||||
func (p *DefaultLoggerPlugin) Author() string {
|
||||
return p.author
|
||||
}
|
||||
|
||||
// Type 返回插件类型
|
||||
func (p *DefaultLoggerPlugin) Type() plugin.PluginType {
|
||||
return p.pluginType
|
||||
}
|
||||
|
||||
// IsEnabled 返回插件是否启用
|
||||
func (p *DefaultLoggerPlugin) IsEnabled() bool {
|
||||
return p.enabled
|
||||
}
|
||||
|
||||
// SetEnabled 设置插件启用状态
|
||||
func (p *DefaultLoggerPlugin) SetEnabled(enabled bool) {
|
||||
p.enabled = enabled
|
||||
}
|
||||
|
||||
// GetOperationInfo 获取操作的参数信息
|
||||
func (p *DefaultLoggerPlugin) GetOperationInfo(operation string) (map[string]interface{}, error) {
|
||||
return map[string]interface{}{}, nil
|
||||
}
|
||||
|
||||
// GetAllOperations 获取所有操作及其参数信息
|
||||
func (p *DefaultLoggerPlugin) GetAllOperations() map[string]map[string]interface{} {
|
||||
return map[string]map[string]interface{}{}
|
||||
}
|
||||
|
||||
// Init 初始化插件
|
||||
|
@@ -14,36 +14,73 @@ import (
|
||||
// LoggerPlugin 日志插件
|
||||
// 提供文件日志和控制台日志功能
|
||||
type LoggerPlugin struct {
|
||||
*plugin.BasePlugin // 嵌入基本插件结构
|
||||
logFile *os.File // 日志文件
|
||||
logger *log.Logger // 日志记录器
|
||||
config map[string]interface{} // 配置
|
||||
plugin.Plugin // 嵌入接口,确保类型检查
|
||||
name string // 插件名称
|
||||
version string // 插件版本
|
||||
description string // 插件描述
|
||||
author string // 插件作者
|
||||
pluginType plugin.PluginType // 插件类型
|
||||
enabled bool // 是否启用
|
||||
logFile *os.File // 日志文件
|
||||
logger *log.Logger // 日志记录器
|
||||
config map[string]interface{} // 配置
|
||||
}
|
||||
|
||||
// Plugin 导出的插件变量
|
||||
// 注意:变量名必须是Plugin,大小写敏感
|
||||
// 使用方式1: 明确指定插件类型
|
||||
var Plugin = &LoggerPlugin{
|
||||
BasePlugin: plugin.NewBasePlugin(
|
||||
"LoggerPlugin",
|
||||
"1.0.0",
|
||||
"简单的日志记录插件",
|
||||
"开发者",
|
||||
plugin.PluginTypeUtils, // 明确指定为工具类插件
|
||||
),
|
||||
name: "LoggerPlugin",
|
||||
version: "1.0.0",
|
||||
description: "简单的日志记录插件",
|
||||
author: "开发者",
|
||||
pluginType: plugin.PluginTypeUtils, // 明确指定为工具类插件
|
||||
enabled: true,
|
||||
}
|
||||
|
||||
// 使用方式2: 使用默认插件类型(通用插件)
|
||||
// 如果您不关心插件类型或想使用默认的通用插件类型,可以使用以下方式:
|
||||
//
|
||||
// var Plugin = &LoggerPlugin{
|
||||
// BasePlugin: plugin.NewBasePluginWithDefaultType(
|
||||
// "LoggerPlugin",
|
||||
// "1.0.0",
|
||||
// "简单的日志记录插件",
|
||||
// "开发者",
|
||||
// ), // 将自动使用 PluginTypeGeneral 类型
|
||||
// }
|
||||
// Name 返回插件名称
|
||||
func (p *LoggerPlugin) Name() string {
|
||||
return p.name
|
||||
}
|
||||
|
||||
// Version 返回插件版本
|
||||
func (p *LoggerPlugin) Version() string {
|
||||
return p.version
|
||||
}
|
||||
|
||||
// Description 返回插件描述
|
||||
func (p *LoggerPlugin) Description() string {
|
||||
return p.description
|
||||
}
|
||||
|
||||
// Author 返回插件作者
|
||||
func (p *LoggerPlugin) Author() string {
|
||||
return p.author
|
||||
}
|
||||
|
||||
// Type 返回插件类型
|
||||
func (p *LoggerPlugin) Type() plugin.PluginType {
|
||||
return p.pluginType
|
||||
}
|
||||
|
||||
// IsEnabled 返回插件是否启用
|
||||
func (p *LoggerPlugin) IsEnabled() bool {
|
||||
return p.enabled
|
||||
}
|
||||
|
||||
// SetEnabled 设置插件启用状态
|
||||
func (p *LoggerPlugin) SetEnabled(enabled bool) {
|
||||
p.enabled = enabled
|
||||
}
|
||||
|
||||
// GetOperationInfo 获取操作的参数信息
|
||||
func (p *LoggerPlugin) GetOperationInfo(operation string) (map[string]interface{}, error) {
|
||||
return map[string]interface{}{}, nil
|
||||
}
|
||||
|
||||
// GetAllOperations 获取所有操作及其参数信息
|
||||
func (p *LoggerPlugin) GetAllOperations() map[string]map[string]interface{} {
|
||||
return map[string]map[string]interface{}{}
|
||||
}
|
||||
|
||||
// Init 初始化插件
|
||||
func (p *LoggerPlugin) Init(ctx context.Context, config map[string]interface{}) error {
|
||||
|
@@ -12,13 +12,19 @@ import (
|
||||
// StatsPlugin 统计插件
|
||||
// 用于收集和记录系统运行时统计数据
|
||||
type StatsPlugin struct {
|
||||
*plugin.BasePluginImpl // 改为使用BasePluginImpl
|
||||
stats map[string]int64
|
||||
startTime time.Time
|
||||
mu sync.RWMutex
|
||||
tickerStop chan bool
|
||||
ticker *time.Ticker
|
||||
config map[string]interface{}
|
||||
plugin.Plugin // 嵌入接口,确保类型检查
|
||||
name string // 插件名称
|
||||
version string // 插件版本
|
||||
description string // 插件描述
|
||||
author string // 插件作者
|
||||
pluginType plugin.PluginType // 插件类型
|
||||
enabled bool // 是否启用
|
||||
stats map[string]int64
|
||||
startTime time.Time
|
||||
mu sync.RWMutex
|
||||
tickerStop chan bool
|
||||
ticker *time.Ticker
|
||||
config map[string]interface{}
|
||||
}
|
||||
|
||||
// StatsParams 统计请求参数结构体
|
||||
@@ -33,29 +39,60 @@ type StatsParams struct {
|
||||
|
||||
// Plugin 导出的插件变量
|
||||
var Plugin = &StatsPlugin{
|
||||
// 使用默认构造函数,不指定插件类型,将默认为通用插件
|
||||
BasePluginImpl: plugin.NewPluginWithDefaultType(
|
||||
"StatsPlugin",
|
||||
"1.0.0",
|
||||
"系统运行时统计插件",
|
||||
"开发者",
|
||||
),
|
||||
stats: make(map[string]int64),
|
||||
tickerStop: make(chan bool),
|
||||
name: "StatsPlugin",
|
||||
version: "1.0.0",
|
||||
description: "系统运行时统计插件",
|
||||
author: "开发者",
|
||||
pluginType: plugin.PluginTypeUtils, // 指定为工具类插件
|
||||
enabled: true,
|
||||
stats: make(map[string]int64),
|
||||
tickerStop: make(chan bool),
|
||||
}
|
||||
|
||||
// 为展示如何指定类型,我们也可以显式设置插件类型
|
||||
// var Plugin = &StatsPlugin{
|
||||
// BasePlugin: plugin.NewBasePlugin(
|
||||
// "StatsPlugin",
|
||||
// "1.0.0",
|
||||
// "系统运行时统计插件",
|
||||
// "开发者",
|
||||
// plugin.PluginTypeUtils, // 明确指定为工具类插件
|
||||
// ),
|
||||
// stats: make(map[string]int64),
|
||||
// tickerStop: make(chan bool),
|
||||
// }
|
||||
// Name 返回插件名称
|
||||
func (p *StatsPlugin) Name() string {
|
||||
return p.name
|
||||
}
|
||||
|
||||
// Version 返回插件版本
|
||||
func (p *StatsPlugin) Version() string {
|
||||
return p.version
|
||||
}
|
||||
|
||||
// Description 返回插件描述
|
||||
func (p *StatsPlugin) Description() string {
|
||||
return p.description
|
||||
}
|
||||
|
||||
// Author 返回插件作者
|
||||
func (p *StatsPlugin) Author() string {
|
||||
return p.author
|
||||
}
|
||||
|
||||
// Type 返回插件类型
|
||||
func (p *StatsPlugin) Type() plugin.PluginType {
|
||||
return p.pluginType
|
||||
}
|
||||
|
||||
// IsEnabled 返回插件是否启用
|
||||
func (p *StatsPlugin) IsEnabled() bool {
|
||||
return p.enabled
|
||||
}
|
||||
|
||||
// SetEnabled 设置插件启用状态
|
||||
func (p *StatsPlugin) SetEnabled(enabled bool) {
|
||||
p.enabled = enabled
|
||||
}
|
||||
|
||||
// GetOperationInfo 获取操作的参数信息
|
||||
func (p *StatsPlugin) GetOperationInfo(operation string) (map[string]interface{}, error) {
|
||||
return map[string]interface{}{}, nil
|
||||
}
|
||||
|
||||
// GetAllOperations 获取所有操作及其参数信息
|
||||
func (p *StatsPlugin) GetAllOperations() map[string]map[string]interface{} {
|
||||
return map[string]map[string]interface{}{}
|
||||
}
|
||||
|
||||
// Init 初始化插件
|
||||
func (p *StatsPlugin) Init(ctx context.Context, config map[string]interface{}) error {
|
||||
@@ -242,7 +279,15 @@ func (p *StatsPlugin) logStats() {
|
||||
// GetAvailableOperations 获取可用操作列表
|
||||
// 这是一个帮助方法,列出所有可通过Execute调用的操作
|
||||
func (p *StatsPlugin) GetAvailableOperations() []string {
|
||||
return p.GetAvailableActions()
|
||||
// 返回硬编码的操作列表,而不是调用不存在的方法
|
||||
return []string{
|
||||
"incrementstat",
|
||||
"getstat",
|
||||
"recordrequest",
|
||||
"resetstats",
|
||||
"generatestatsreport",
|
||||
"getallstats",
|
||||
}
|
||||
}
|
||||
|
||||
// main 函数是必须的,但不会被调用
|
||||
|
@@ -14,22 +14,72 @@ import (
|
||||
// StoragePlugin 存储插件
|
||||
// 提供简单的文件存储功能
|
||||
type StoragePlugin struct {
|
||||
*plugin.BasePlugin // 嵌入基本插件结构
|
||||
storageDir string // 存储目录
|
||||
config map[string]interface{} // 配置
|
||||
mu sync.RWMutex // 读写锁
|
||||
plugin.Plugin // 嵌入接口,确保类型检查
|
||||
name string // 插件名称
|
||||
version string // 插件版本
|
||||
description string // 插件描述
|
||||
author string // 插件作者
|
||||
pluginType plugin.PluginType // 插件类型
|
||||
enabled bool // 是否启用
|
||||
storageDir string // 存储目录
|
||||
config map[string]interface{} // 配置
|
||||
mu sync.RWMutex // 读写锁
|
||||
}
|
||||
|
||||
// Plugin 导出的插件变量
|
||||
// 注意:变量名必须是Plugin,大小写敏感
|
||||
var Plugin = &StoragePlugin{
|
||||
BasePlugin: plugin.NewBasePlugin(
|
||||
"StoragePlugin",
|
||||
"1.0.0",
|
||||
"简单的文件存储插件",
|
||||
"开发者",
|
||||
plugin.PluginTypeStorage, // 设置插件类型为存储插件
|
||||
),
|
||||
name: "StoragePlugin",
|
||||
version: "1.0.0",
|
||||
description: "简单的文件存储插件",
|
||||
author: "开发者",
|
||||
pluginType: plugin.PluginTypeStorage, // 设置插件类型为存储插件
|
||||
enabled: true,
|
||||
}
|
||||
|
||||
// Name 返回插件名称
|
||||
func (p *StoragePlugin) Name() string {
|
||||
return p.name
|
||||
}
|
||||
|
||||
// Version 返回插件版本
|
||||
func (p *StoragePlugin) Version() string {
|
||||
return p.version
|
||||
}
|
||||
|
||||
// Description 返回插件描述
|
||||
func (p *StoragePlugin) Description() string {
|
||||
return p.description
|
||||
}
|
||||
|
||||
// Author 返回插件作者
|
||||
func (p *StoragePlugin) Author() string {
|
||||
return p.author
|
||||
}
|
||||
|
||||
// Type 返回插件类型
|
||||
func (p *StoragePlugin) Type() plugin.PluginType {
|
||||
return p.pluginType
|
||||
}
|
||||
|
||||
// IsEnabled 返回插件是否启用
|
||||
func (p *StoragePlugin) IsEnabled() bool {
|
||||
return p.enabled
|
||||
}
|
||||
|
||||
// SetEnabled 设置插件启用状态
|
||||
func (p *StoragePlugin) SetEnabled(enabled bool) {
|
||||
p.enabled = enabled
|
||||
}
|
||||
|
||||
// GetOperationInfo 获取操作的参数信息
|
||||
func (p *StoragePlugin) GetOperationInfo(operation string) (map[string]interface{}, error) {
|
||||
return map[string]interface{}{}, nil
|
||||
}
|
||||
|
||||
// GetAllOperations 获取所有操作及其参数信息
|
||||
func (p *StoragePlugin) GetAllOperations() map[string]map[string]interface{} {
|
||||
return map[string]map[string]interface{}{}
|
||||
}
|
||||
|
||||
// Init 初始化插件
|
||||
|
Reference in New Issue
Block a user