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

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

188 lines
4.4 KiB
Go

package main
import (
"context"
"fmt"
"runtime"
"github.com/darkit/goproxy/examples/plugin"
)
// 这是内置插件的示例实现
// LogPlugin 日志插件
type LogPlugin struct {
name string
version string
description string
author string
enabled bool
level string
pluginType plugin.PluginType
}
// 创建内置日志插件
func NewLogPlugin() *LogPlugin {
return &LogPlugin{
name: "InternalLogPlugin",
version: "1.0.0",
description: "内置日志插件,在不支持动态加载插件的平台上使用",
author: "开发者",
pluginType: plugin.PluginTypeUtils, // 设置为工具类插件
enabled: true,
level: "info",
}
}
// 实现Plugin接口
func (p *LogPlugin) Name() string {
return p.name
}
func (p *LogPlugin) Version() string {
return p.version
}
func (p *LogPlugin) Description() string {
return p.description
}
func (p *LogPlugin) Author() string {
return p.author
}
// Type 实现插件类型方法
func (p *LogPlugin) Type() plugin.PluginType {
return p.pluginType
}
func (p *LogPlugin) IsEnabled() bool {
return p.enabled
}
func (p *LogPlugin) SetEnabled(enabled bool) {
p.enabled = enabled
}
func (p *LogPlugin) Init(ctx context.Context, config map[string]interface{}) error {
if level, ok := config["level"].(string); ok {
p.level = level
}
fmt.Println("内置日志插件已初始化,日志级别:", p.level)
return nil
}
func (p *LogPlugin) Start(ctx context.Context) error {
fmt.Println("内置日志插件已启动")
return nil
}
func (p *LogPlugin) Stop(ctx context.Context) error {
fmt.Println("内置日志插件已停止")
return nil
}
// Log 记录日志
func (p *LogPlugin) Log(message string) {
fmt.Printf("[%s] %s\n", p.level, message)
}
func main() {
// 创建插件管理器
pluginsDir := "./plugins"
pm := plugin.NewPluginManager(pluginsDir)
// 检查当前系统是否支持动态加载插件
if pm.IsDynamicLoadingSupported() {
fmt.Printf("当前系统(%s)支持动态加载插件\n", runtime.GOOS)
} else {
fmt.Printf("当前系统(%s)不支持动态加载插件\n", runtime.GOOS)
// 在不支持动态加载的系统上使用内置插件
logPlugin := NewLogPlugin()
pm.RegisterPlugin(logPlugin)
}
// 加载插件
fmt.Println("正在加载插件...")
if err := pm.LoadPlugins(); err != nil {
fmt.Printf("加载插件失败: %v\n", err)
}
// 配置插件
logPluginConfig := map[string]interface{}{
"level": "debug",
}
if err := pm.SetPluginConfig("InternalLogPlugin", logPluginConfig); err != nil {
fmt.Printf("配置插件失败: %v\n", err)
}
// 初始化插件
ctx := context.Background()
fmt.Println("正在初始化插件...")
if err := pm.InitPlugins(ctx); err != nil {
fmt.Printf("初始化插件失败: %v\n", err)
}
// 启动插件
fmt.Println("正在启动插件...")
if err := pm.StartPlugins(ctx); err != nil {
fmt.Printf("启动插件失败: %v\n", err)
}
// 获取并打印所有插件信息
fmt.Println("\n已加载的插件列表:")
plugins := pm.GetPluginInfos()
for i, info := range plugins {
status := "启用"
if !info.Enabled {
status = "禁用"
}
fmt.Printf("[%d] %s (v%s) - %s [%s]\n作者: %s\n类型: %s\n",
i, info.Name, info.Version, info.Description, status, info.Author, info.Type)
// 打印插件配置
if len(info.Config) > 0 {
fmt.Println("配置:")
for k, v := range info.Config {
fmt.Printf(" %s: %v\n", k, v)
}
}
fmt.Println()
}
// 使用第一个启用的插件(这里只是示例)
if len(plugins) > 0 {
for _, info := range plugins {
if info.Enabled {
fmt.Printf("正在使用插件: %s\n", info.Name)
if p, ok := pm.GetPlugin(info.Name); ok {
// 这里可以根据插件类型执行特定操作
if logPlugin, ok := p.(*LogPlugin); ok {
logPlugin.Log("这是一条测试日志消息")
}
}
break
}
}
}
// 按类型获取和使用插件
fmt.Println("\n按类型获取插件:")
utilsPlugins := pm.GetPluginsByType(plugin.PluginTypeUtils)
fmt.Printf("找到 %d 个工具类插件\n", len(utilsPlugins))
for _, p := range utilsPlugins {
fmt.Printf("工具类插件: %s\n", p.Name())
if logPlugin, ok := p.(*LogPlugin); ok {
logPlugin.Log("通过类型获取到的日志插件记录消息")
}
}
// 停止插件
fmt.Println("\n正在停止插件...")
if err := pm.StopPlugins(ctx); err != nil {
fmt.Printf("停止插件失败: %v\n", err)
}
fmt.Println("示例结束")
}