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