增强插件系统:添加插件类型支持
- 在插件接口和基本插件结构中引入插件类型(PluginType),并定义了多种预定义的插件类型。 - 更新插件管理器以支持按类型管理插件,新增按类型获取、初始化和启动插件的方法。 - 修改现有插件(如日志插件和统计插件)以实现插件类型接口,确保兼容性。 - 优化插件信息输出,包含插件类型信息。 此更新提升了插件系统的灵活性和可扩展性,便于未来添加更多插件类型。
This commit is contained in:
132
examples/plugin/example/main.go
Normal file
132
examples/plugin/example/main.go
Normal file
@@ -0,0 +1,132 @@
|
||||
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所有插件已停止")
|
||||
}
|
Reference in New Issue
Block a user