- 在插件接口和基本插件结构中引入插件类型(PluginType),并定义了多种预定义的插件类型。 - 更新插件管理器以支持按类型管理插件,新增按类型获取、初始化和启动插件的方法。 - 修改现有插件(如日志插件和统计插件)以实现插件类型接口,确保兼容性。 - 优化插件信息输出,包含插件类型信息。 此更新提升了插件系统的灵活性和可扩展性,便于未来添加更多插件类型。
133 lines
3.8 KiB
Go
133 lines
3.8 KiB
Go
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所有插件已停止")
|
||
}
|