增强插件系统:添加插件执行功能
- 在插件接口和基本插件实现中新增 Execute 方法,支持插件功能的动态执行。 - 更新各个插件(如日志插件、统计插件、存储插件等)以实现 Execute 方法,允许通过操作名称和参数执行特定功能。 - 在插件管理器中添加 ExecutePlugin、ExecutePluginsByType 和 ExecuteAllPlugins 方法,便于批量执行插件操作。 - 示例程序中更新插件调用方式,展示如何使用 Execute 方法进行操作。 此更新提升了插件系统的灵活性和可扩展性,便于开发者动态管理和执行插件功能。
This commit is contained in:
133
examples/plugin/example/dynamic_params.go
Normal file
133
examples/plugin/example/dynamic_params.go
Normal file
@@ -0,0 +1,133 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/darkit/goproxy/examples/plugin"
|
||||
)
|
||||
|
||||
// 演示动态参数传递功能
|
||||
func DynamicParamsExample() {
|
||||
// 创建上下文
|
||||
ctx := context.Background()
|
||||
|
||||
// 获取插件目录
|
||||
pluginsDir := filepath.Join("..", "plugins", "dist")
|
||||
if _, err := os.Stat(pluginsDir); os.IsNotExist(err) {
|
||||
fmt.Printf("插件目录不存在: %s\n", pluginsDir)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建插件管理器
|
||||
pm := plugin.NewPluginManager(pluginsDir)
|
||||
|
||||
// 加载插件
|
||||
fmt.Println("正在加载插件...")
|
||||
if err := pm.LoadPlugins(); err != nil {
|
||||
fmt.Printf("加载插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 初始化所有插件
|
||||
if err := pm.InitPlugins(ctx); err != nil {
|
||||
fmt.Printf("初始化插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 启动所有插件
|
||||
if err := pm.StartPlugins(ctx); err != nil {
|
||||
fmt.Printf("启动插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 打印所有插件信息
|
||||
fmt.Println("\n=== 已加载的插件 ===")
|
||||
for _, info := range pm.GetPluginInfos() {
|
||||
fmt.Printf("插件: %s (版本: %s, 类型: %s)\n", info.Name, info.Version, info.Type)
|
||||
}
|
||||
fmt.Println()
|
||||
|
||||
// 示例1: 调用日志插件
|
||||
fmt.Println("=== 示例1: 调用日志插件 ===")
|
||||
logResult, err := pm.ExecutePlugin(ctx, "LoggerPlugin", "info", map[string]interface{}{
|
||||
"message": "这是通过动态参数传递的日志消息",
|
||||
})
|
||||
fmt.Printf("日志插件调用结果: %v, 错误: %v\n", logResult, err)
|
||||
|
||||
// 获取日志状态
|
||||
statusResult, err := pm.ExecutePlugin(ctx, "LoggerPlugin", "getLoggerStatus", nil)
|
||||
fmt.Printf("日志插件状态: %v, 错误: %v\n", statusResult, err)
|
||||
|
||||
// 示例2: 调用存储插件
|
||||
fmt.Println("\n=== 示例2: 调用存储插件 ===")
|
||||
// 保存文件
|
||||
saveResult, err := pm.ExecutePlugin(ctx, "StoragePlugin", "saveFile", map[string]interface{}{
|
||||
"filename": "test.txt",
|
||||
"data": "这是通过动态参数传递保存的测试数据",
|
||||
})
|
||||
fmt.Printf("保存文件结果: %v, 错误: %v\n", saveResult, err)
|
||||
|
||||
// 列出文件
|
||||
listResult, err := pm.ExecutePlugin(ctx, "StoragePlugin", "listFiles", nil)
|
||||
fmt.Printf("文件列表: %v, 错误: %v\n", listResult, err)
|
||||
|
||||
// 读取文件
|
||||
loadResult, err := pm.ExecutePlugin(ctx, "StoragePlugin", "loadFile", map[string]interface{}{
|
||||
"filename": "test.txt",
|
||||
})
|
||||
fmt.Printf("读取文件内容: %v, 错误: %v\n", loadResult, err)
|
||||
|
||||
// 获取存储信息
|
||||
infoResult, err := pm.ExecutePlugin(ctx, "StoragePlugin", "getStorageInfo", nil)
|
||||
fmt.Printf("存储插件信息: %v, 错误: %v\n", infoResult, err)
|
||||
|
||||
// 示例3: 调用统计插件
|
||||
fmt.Println("\n=== 示例3: 调用统计插件 ===")
|
||||
// 记录请求
|
||||
pm.ExecutePlugin(ctx, "StatsPlugin", "recordRequest", map[string]interface{}{
|
||||
"bytesReceived": 1024.0,
|
||||
"bytesSent": 2048.0,
|
||||
"isError": false,
|
||||
})
|
||||
|
||||
// 睡眠一段时间以便观察
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
// 再次记录请求
|
||||
pm.ExecutePlugin(ctx, "StatsPlugin", "recordRequest", map[string]interface{}{
|
||||
"bytesReceived": 512.0,
|
||||
"bytesSent": 768.0,
|
||||
"isError": true,
|
||||
})
|
||||
|
||||
// 获取统计报告
|
||||
reportResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "getStatsReport", nil)
|
||||
fmt.Printf("统计报告: %v, 错误: %v\n", reportResult, err)
|
||||
|
||||
// 示例4: 使用ExecutePluginsByType调用所有工具类插件
|
||||
fmt.Println("\n=== 示例4: 按类型调用插件 ===")
|
||||
typeResults := pm.ExecutePluginsByType(ctx, plugin.PluginTypeUtils, "info", map[string]interface{}{
|
||||
"message": "这条消息将发送给所有工具类插件",
|
||||
})
|
||||
fmt.Printf("工具类插件调用结果: %v\n", typeResults)
|
||||
|
||||
// 示例5: 使用ExecuteAllPlugins调用所有插件
|
||||
fmt.Println("\n=== 示例5: 调用所有插件 ===")
|
||||
allResults := pm.ExecuteAllPlugins(ctx, "getLoggerStatus", nil)
|
||||
fmt.Println("所有插件调用结果:")
|
||||
for name, result := range allResults {
|
||||
fmt.Printf(" %s: %v\n", name, result)
|
||||
}
|
||||
|
||||
// 停止所有插件
|
||||
if err := pm.StopPlugins(ctx); err != nil {
|
||||
fmt.Printf("停止插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println("\n示例结束")
|
||||
}
|
Reference in New Issue
Block a user