- 在插件助手中新增 ValidateParams 函数,用于验证传入参数是否符合定义,确保参数的完整性和正确性。 - 更新 ExecuteAction 方法,集成参数验证逻辑,提升插件执行的安全性和可靠性。 - 示例程序中添加新的选项,展示如何生成插件API文档和OpenAPI/Swagger文档,增强用户体验。 此更新提升了插件系统的健壮性,便于开发者更好地管理和使用插件功能。
163 lines
4.5 KiB
Go
163 lines
4.5 KiB
Go
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.Println("3. 插件操作参数信息示例")
|
||
fmt.Println("4. 插件API文档生成示例")
|
||
fmt.Println("5. OpenAPI/Swagger文档生成示例")
|
||
fmt.Print("请输入选项 (1-5): ")
|
||
|
||
var choice int
|
||
fmt.Scan(&choice)
|
||
|
||
switch choice {
|
||
case 1:
|
||
BasicPluginExample()
|
||
case 2:
|
||
DynamicParamsExample()
|
||
case 3:
|
||
OperationInfoExample()
|
||
case 4:
|
||
DocGeneratorExample()
|
||
case 5:
|
||
OpenAPIGeneratorExample()
|
||
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所有插件已停止")
|
||
}
|