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

相关推荐
冬奇Lab6 小时前
开源项目第244期:高性价比人生指南 —— 767 条建议,每条写明成本、收益、证据等级和原始出处
开源·资讯
数字会议深科技7 小时前
会议方案设计应如何融入 AI 和物联网等领先会议技术
人工智能·物联网·会议解决方案·会议设计方案
Alinket8 小时前
不训练模型也能加 AI:5 套可直接量产的组合方案
人工智能·物联网·ai·健康医疗·无线通信·智能硬件·iot
Imagination官方博客8 小时前
从开源驱动到完整软件栈:Imagination 助力 RISC-V 图形生态发展
开源·risc-v
wuyk5559 小时前
《WiFi 嵌入式物联网开发全套实战》| 第 44 章 物联网 WiFi 产品整体架构设计(配网 + 通信 + 保活 + 升级)
物联网
袋鼠云数栈9 小时前
让 SQL 解析不再重复造轮子:SqlParserX 正式开源
数据库·人工智能·sql·开源·数据治理
程序员老赵10 小时前
Docker 部署 Hue:轻松搭建数据库与数据仓库 SQL 查询平台
sql·docker·开源
樊小肆10 小时前
睡前丢给它三张工单,早上收代码和账单:我开源了一个 DeepSeek 驱动的 AI 编码助手
开源·ai编程·deepseek
SL-staff10 小时前
4G设备掉线三层归因实战:SIM卡、模组、JVS-IOT网关配置的精准诊断与代码级验证
物联网·mqtt协议·at指令·嵌入式通信·jvs-iot·4g调试·物联网运维
珠海西格电力11 小时前
物联网(IoT)在零碳园区中的关键作用:万物互联与数据采集
大数据·人工智能·物联网·安全·系统架构·能源