Files
goproxy/examples/plugin/example/main.go
DarkiT cc4c677553 增强插件系统:添加参数验证功能
- 在插件助手中新增 ValidateParams 函数,用于验证传入参数是否符合定义,确保参数的完整性和正确性。
- 更新 ExecuteAction 方法,集成参数验证逻辑,提升插件执行的安全性和可靠性。
- 示例程序中添加新的选项,展示如何生成插件API文档和OpenAPI/Swagger文档,增强用户体验。

此更新提升了插件系统的健壮性,便于开发者更好地管理和使用插件功能。
2025-03-14 13:32:36 +08:00

163 lines
4.5 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.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所有插件已停止")
}