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