14-第14章-扩展点与插件机制

第14章:扩展点与插件机制

14.1 扩展点设计

14.1.1 系统扩展点

sfsEdgeStore 设计了多个扩展点,允许在不修改核心代码的情况下扩展功能:

扩展点 位置 说明
数据接收前 MQTT 消息处理器 消息到达后、存储前
数据存储前 数据库写入前 数据验证、转换
数据查询后 HTTP 响应前 查询结果转换、过滤
监控数据 监控模块 自定义监控指标
告警触发 告警模块 自定义告警规则

14.1.2 Hook 接口设计

go 复制代码
package hooks

type Hook interface {
    Name() string
    Priority() int
}

type PreMessageHook interface {
    Hook
    PreProcess(payload []byte) ([]byte, error)
}

type PreStoreHook interface {
    Hook
    PreStore(records []*map[string]interface{}) ([]*map[string]interface{}, error)
}

type PostQueryHook interface {
    Hook
    PostQuery(records record.Records) (record.Records, error)
}

type MonitorHook interface {
    Hook
    OnMetrics(metrics *monitor.Metrics) error
}

type AlertHook interface {
    Hook
    OnAlert(alert *alert.Alert) error
}

14.2 插件系统

14.2.1 插件加载器

go 复制代码
package plugin

import (
    "plugin"
    "sync"
)

type Plugin interface {
    Name() string
    Version() string
    Init() error
    Shutdown() error
}

type Manager struct {
    plugins map[string]Plugin
    mu      sync.RWMutex
}

func NewManager() *Manager {
    return &Manager{
        plugins: make(map[string]Plugin),
    }
}

func (m *Manager) LoadPlugin(path string) error {
    p, err := plugin.Open(path)
    if err != nil {
        return err
    }
    
    sym, err := p.Lookup("Plugin")
    if err != nil {
        return err
    }
    
    plugin, ok := sym.(Plugin)
    if !ok {
        return fmt.Errorf("unexpected type from module symbol")
    }
    
    if err := plugin.Init(); err != nil {
        return err
    }
    
    m.mu.Lock()
    m.plugins[plugin.Name()] = plugin
    m.mu.Unlock()
    
    return nil
}

func (m *Manager) GetPlugin(name string) (Plugin, bool) {
    m.mu.RLock()
    defer m.mu.RUnlock()
    p, ok := m.plugins[name]
    return p, ok
}

func (m *Manager) ShutdownAll() {
    m.mu.Lock()
    defer m.mu.Unlock()
    
    for name, p := range m.plugins {
        if err := p.Shutdown(); err != nil {
            log.Printf("Error shutting down plugin %s: %v", name, err)
        }
        delete(m.plugins, name)
    }
}

14.2.2 创建插件

go 复制代码
// 插件示例:myplugin.go
package main

import (
    "log"
    "sfsEdgeStore/plugin"
    "sfsEdgeStore/hooks"
)

type MyPlugin struct{}

func (p *MyPlugin) Name() string {
    return "my-plugin"
}

func (p *MyPlugin) Version() string {
    return "1.0.0"
}

func (p *MyPlugin) Init() error {
    log.Println("My plugin initialized")
    hooks.RegisterPreStoreHook(&MyPreStoreHook{})
    return nil
}

func (p *MyPlugin) Shutdown() error {
    log.Println("My plugin shutdown")
    return nil
}

type MyPreStoreHook struct{}

func (h *MyPreStoreHook) Name() string {
    return "my-pre-store"
}

func (h *MyPreStoreHook) Priority() int {
    return 100
}

func (h *MyPreStoreHook) PreStore(records []*map[string]interface{}) ([]*map[string]interface{}, error) {
    log.Printf("PreStore hook called with %d records", len(records))
    for _, record := range records {
        if processed, ok := (*record)["processed"]; !ok || !processed.(bool) {
            (*record)["processed"] = true
            (*record)["processed_at"] = time.Now().UnixNano()
        }
    }
    return records, nil
}

var Plugin MyPlugin

14.2.3 编译插件

bash 复制代码
# 编译为共享库
go build -buildmode=plugin -o myplugin.so myplugin.go

# 在主程序中加载
pluginManager := plugin.NewManager()
err := pluginManager.LoadPlugin("./myplugin.so")

14.3 实战练习

练习 14.1:Hook 开发

开发一个 PreMessageHook,对消息进行解密。

练习 14.2:插件开发

开发一个完整的插件,包含多个 Hook。

练习 14.3:热重载

实现插件的热重载功能。

14.4 本章小结

本章讲解了系统的扩展点和插件机制:

  • 系统扩展点设计
  • Hook 接口定义
  • 插件系统实现
  • 如何开发和加载插件

插件机制让系统具有极强的扩展性。


本书版本 :1.0.0
最后更新 :2026-03-08
sfsEdgeStore - 让边缘数据存储更简单!🚀
技术栈 - Go语言、sfsDb与EdgeX Foundry。纯golang工业物联网边缘计算技术栈
项目地址GitHub
GitCode 镜像GitCode

相关推荐
星恒讯工业路由器4 小时前
AGV集群通信架构:从单点到百台级调度的挑战与对策
网络·物联网·信息与通信·工业物联网·通信架构·agv集群·实时调度
技术硬汉6 小时前
4G/5G蜂窝天线增益越大越好吗?怎么选适合自己的天线
物联网·5g·信息与通信·iot
加密狗复制模拟7 小时前
使用x64dbg进行超级狗super dog 加密狗逆向分析复制 超级狗克隆备份
安全·软件工程·个人开发·同态加密
超级码力6667 小时前
【软件工程】【软件生命周期】软件生命周期8阶段
软件工程·软件构建·软件需求
土星云SaturnCloud9 小时前
抽水蓄能设备智慧运营:基于土星云边缘计算实现机组全生命周期预测性维护
服务器·人工智能·ai·边缘计算
梁辰兴10 小时前
软件工程:系统动态分析
软件工程·基本概念·petri网·应用要点·状态转换图·系统动态分析·状态转换表
冬奇Lab10 小时前
开源项目第172期:agentOS — 以库的形式给 AI Agent 一个操作系统,冷启动 92x 更快、内存 47x 更少
人工智能·开源·agent
mengpp_12345612 小时前
城市排水泵站物联网监控系统:智能值守,革新市政运维模式
物联网·智慧城市·iot
AI云海12 小时前
iOS 多 Target 打包、UAT/生产测试与上架 App Store 全流程指南
ios
阿里超级工程师14 小时前
最新快速申请ios打包证书和profile文件步骤
ios·打包证书