Files
goproxy/examples/plugin/example/main.go
DarkiT 9f78cb483b 增强插件系统:添加插件执行功能
- 在插件接口和基本插件实现中新增 Execute 方法,支持插件功能的动态执行。
- 更新各个插件(如日志插件、统计插件、存储插件等)以实现 Execute 方法,允许通过操作名称和参数执行特定功能。
- 在插件管理器中添加 ExecutePlugin、ExecutePluginsByType 和 ExecuteAllPlugins 方法,便于批量执行插件操作。
- 示例程序中更新插件调用方式,展示如何使用 Execute 方法进行操作。

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

154 lines
4.3 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 main() {
fmt.Println("==== 插件系统示例 ====")
fmt.Println("请选择要运行的示例:")
fmt.Println("1. 基本插件加载和管理")
fmt.Println("2. 动态参数传递示例")
fmt.Print("请输入选项 (1-2): ")
var choice int
fmt.Scan(&choice)
switch choice {
case 1:
BasicPluginExample()
case 2:
DynamicParamsExample()
default:
fmt.Println("无效的选项")
}
}
// BasicPluginExample 基本的插件加载和管理示例
func BasicPluginExample() {
// 创建上下文
ctx := context.Background()
// 获取插件目录
pluginsDir := filepath.Join("..", "plugins", "dist")
if _, err := os.Stat(pluginsDir); os.IsNotExist(err) {
if err := os.MkdirAll(pluginsDir, 0o755); err != nil {
fmt.Printf("创建插件目录失败: %v\n", err)
return
}
}
// 创建插件管理器
pm := plugin.NewPluginManager(pluginsDir)
// 检查是否支持动态加载插件
if pm.IsDynamicLoadingSupported() {
fmt.Println("当前系统支持动态加载插件")
} else {
fmt.Println("当前系统不支持动态加载插件,将使用静态插件")
// 在不支持动态加载的平台上注册内置插件
// 这里需要导入并注册所有内置插件
// 例如pm.RegisterPlugin(logger.Plugin)
}
// 加载插件
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\n", info.Name)
fmt.Printf("版本: %s\n", info.Version)
fmt.Printf("描述: %s\n", info.Description)
fmt.Printf("作者: %s\n", info.Author)
fmt.Printf("类型: %s\n", info.Type)
fmt.Printf("启用状态: %v\n", info.Enabled)
fmt.Println("---")
}
// 按类型获取插件
fmt.Println("\n=== 按类型获取插件 ===")
// 获取所有存储类型插件
storagePlugins := pm.GetPluginsByType(plugin.PluginTypeStorage)
fmt.Printf("存储插件数量: %d\n", len(storagePlugins))
for _, p := range storagePlugins {
fmt.Printf("存储插件: %s (版本: %s)\n", p.Name(), p.Version())
}
// 获取所有工具类型插件
utilsPlugins := pm.GetPluginsByType(plugin.PluginTypeUtils)
fmt.Printf("工具插件数量: %d\n", len(utilsPlugins))
for _, p := range utilsPlugins {
fmt.Printf("工具插件: %s (版本: %s)\n", p.Name(), p.Version())
}
// 在生命周期的不同阶段按类型初始化和启动插件
fmt.Println("\n=== 按类型初始化和启动插件 ===")
// 例如,在应用程序启动阶段只初始化工具插件
if err := pm.InitPluginsByType(ctx, plugin.PluginTypeUtils); err != nil {
fmt.Printf("初始化工具插件失败: %v\n", err)
} else {
fmt.Println("工具插件初始化成功")
}
// 在需要存储功能时初始化存储插件
if err := pm.InitPluginsByType(ctx, plugin.PluginTypeStorage); err != nil {
fmt.Printf("初始化存储插件失败: %v\n", err)
} else {
fmt.Println("存储插件初始化成功")
}
// 使用特定类型的插件示例
fmt.Println("\n=== 使用特定类型的插件示例 ===")
fmt.Println("注意:这部分代码在真实环境中需要使用类型断言或接口来处理")
fmt.Println("在实际应用中,应该为每种类型的插件定义专门的接口")
// 按类型停止插件
fmt.Println("\n=== 按类型停止插件 ===")
// 首先停止存储插件
if err := pm.StopPluginsByType(ctx, plugin.PluginTypeStorage); err != nil {
fmt.Printf("停止存储插件失败: %v\n", err)
} else {
fmt.Println("存储插件已停止")
}
// 然后停止工具插件
if err := pm.StopPluginsByType(ctx, plugin.PluginTypeUtils); err != nil {
fmt.Printf("停止工具插件失败: %v\n", err)
} else {
fmt.Println("工具插件已停止")
}
// 确保所有剩余插件都被停止
if err := pm.StopPlugins(ctx); err != nil {
fmt.Printf("停止剩余插件失败: %v\n", err)
return
}
fmt.Println("\n所有插件已停止")
}