- 在插件系统中添加 PluginHelper 结构体,简化插件方法的自动发现和注册。 - 更新 BasePluginImpl 以支持通过辅助器执行插件方法,增强 Execute 方法的灵活性。 - 统计插件和示例程序中实现新的方法调用方式,展示如何使用自动注册的方法。 - 通过结构体参数传递,简化插件调用过程,提升用户体验。 此更新提升了插件系统的可扩展性和易用性,便于开发者动态管理和执行插件功能。
159 lines
4.7 KiB
Go
159 lines
4.7 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"os"
|
||
"path/filepath"
|
||
|
||
"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()
|
||
|
||
// ======= 旧方式:直接使用Execute方法 =======
|
||
fmt.Println("=== 示例1: 直接使用Execute方法 ===")
|
||
|
||
// 调用日志插件
|
||
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)
|
||
|
||
// ======= 新方式:使用自动发现的方法 =======
|
||
fmt.Println("\n=== 示例2: 使用自动注册的方法 ===")
|
||
|
||
// 获取StatsPlugin
|
||
_, ok := pm.GetPlugin("StatsPlugin")
|
||
if !ok {
|
||
fmt.Println("未找到StatsPlugin")
|
||
return
|
||
}
|
||
|
||
// 获取StatsPlugin支持的所有操作
|
||
operationsResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "getAvailableOperations", nil)
|
||
if err != nil {
|
||
fmt.Printf("获取操作失败: %v\n", err)
|
||
} else {
|
||
fmt.Println("StatsPlugin支持的操作:")
|
||
operations, ok := operationsResult.([]string)
|
||
if ok {
|
||
for i, op := range operations {
|
||
fmt.Printf(" %d. %s\n", i+1, op)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 使用结构体参数
|
||
fmt.Println("\n使用结构体参数记录请求:")
|
||
recordResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "recordrequest", map[string]interface{}{
|
||
"bytesReceived": 2048,
|
||
"bytesSent": 4096,
|
||
"isError": false,
|
||
})
|
||
fmt.Printf("记录请求结果: %v, 错误: %v\n", recordResult, err)
|
||
|
||
// 获取统计数据
|
||
fmt.Println("\n获取统计数据:")
|
||
statsResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "getallstats", nil)
|
||
fmt.Printf("统计数据: %v, 错误: %v\n", statsResult, err)
|
||
|
||
// 增加自定义统计项
|
||
fmt.Println("\n增加自定义统计项:")
|
||
incrResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "incrementstat", map[string]interface{}{
|
||
"name": "custom_counter",
|
||
"value": 42,
|
||
})
|
||
fmt.Printf("增加统计项结果: %v, 错误: %v\n", incrResult, err)
|
||
|
||
// 获取统计报告
|
||
fmt.Println("\n获取统计报告:")
|
||
reportResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "generatestatsreport", nil)
|
||
fmt.Printf("统计报告: %v, 错误: %v\n", reportResult, err)
|
||
|
||
// 动态调用StoragePlugin方法
|
||
fmt.Println("\n=== 示例3: 动态调用StoragePlugin方法 ===")
|
||
|
||
// 保存文件
|
||
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)
|
||
|
||
// 展示操作名不区分大小写
|
||
fmt.Println("\n=== 示例4: 操作名不区分大小写 ===")
|
||
caseSensitiveResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "IncrementStat", map[string]interface{}{
|
||
"name": "case_test",
|
||
"value": 100,
|
||
})
|
||
fmt.Printf("使用大写操作名结果: %v, 错误: %v\n", caseSensitiveResult, err)
|
||
|
||
// 获取后验证
|
||
checkResult, err := pm.ExecutePlugin(ctx, "StatsPlugin", "getstat", map[string]interface{}{
|
||
"name": "case_test",
|
||
})
|
||
fmt.Printf("验证结果: %v, 错误: %v\n", checkResult, err)
|
||
|
||
// 停止所有插件
|
||
if err := pm.StopPlugins(ctx); err != nil {
|
||
fmt.Printf("停止插件失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
fmt.Println("\n示例结束")
|
||
}
|