Files
goproxy/examples/plugin/example/dynamic_params.go
DarkiT b6bf2c5699 增强插件系统:引入插件辅助器和自动方法发现功能
- 在插件系统中添加 PluginHelper 结构体,简化插件方法的自动发现和注册。
- 更新 BasePluginImpl 以支持通过辅助器执行插件方法,增强 Execute 方法的灵活性。
- 统计插件和示例程序中实现新的方法调用方式,展示如何使用自动注册的方法。
- 通过结构体参数传递,简化插件调用过程,提升用户体验。

此更新提升了插件系统的可扩展性和易用性,便于开发者动态管理和执行插件功能。
2025-03-14 11:37:42 +08:00

159 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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示例结束")
}