Files
goproxy/examples/plugin/example/main.go
DarkiT 098c721ee9 增强插件系统:添加插件类型支持
- 在插件接口和基本插件结构中引入插件类型(PluginType),并定义了多种预定义的插件类型。
- 更新插件管理器以支持按类型管理插件,新增按类型获取、初始化和启动插件的方法。
- 修改现有插件(如日志插件和统计插件)以实现插件类型接口,确保兼容性。
- 优化插件信息输出,包含插件类型信息。

此更新提升了插件系统的灵活性和可扩展性,便于未来添加更多插件类型。
2025-03-14 11:07:53 +08:00

133 lines
3.8 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() {
// 创建上下文
ctx := context.Background()
// 获取插件目录
pluginsDir := filepath.Join("..", "plugins")
if _, err := os.Stat(pluginsDir); os.IsNotExist(err) {
if err := os.MkdirAll(pluginsDir, 0o755); err != nil {
fmt.Printf("创建插件目录失败: %v\n", err)
os.Exit(1)
}
}
// 创建插件管理器
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)
os.Exit(1)
}
// 初始化所有插件
if err := pm.InitPlugins(ctx); err != nil {
fmt.Printf("初始化插件失败: %v\n", err)
os.Exit(1)
}
// 启动所有插件
if err := pm.StartPlugins(ctx); err != nil {
fmt.Printf("启动插件失败: %v\n", err)
os.Exit(1)
}
// 打印所有插件信息
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)
os.Exit(1)
}
fmt.Println("\n所有插件已停止")
}