乐于分享
好东西不私藏

在 Node-RED 之上做平台:插件化与工程化

在 Node-RED 之上做平台:插件化与工程化

在 Node-RED 之上做平台:插件化与工程化

系列:《矿山边缘计算网关技术实践》第 2 篇
上一篇:为什么矿山边缘网关需要一个"流编排"运行时

选择了 Node-RED 做运行时,只是拿到了"流编排"这层地基。一个可交付的工业网关还需要:插件怎么装、配置怎么管、界面怎么做、变更怎么热生效。这一篇讲我们在 Node-RED 之上补的四件事。

1. 插件化:一个驱动/插件 = 一个 npm 包

Node-RED 原生支持"节点包"(palette),但我们还引入了第二类扩展——插件(plugin),用于 Editor 侧边栏、运行时生命周期这类非节点能力。

关键机制是 plugins-links/目录:每个插件是独立的 npm 包,通过 package.json声明自己,被 Node-RED 识别加载。看一个真实例子(plugins-links/status-panel/package.json):

{   "name": "@mine-edge/node-red-contrib-status-panel",   "version": "0.1.0",   "description": "设备状态监控面板 — Node-RED Editor 侧边栏扩展,实时显示设备连接状态和采集统计",   "main": "mine-status.js",   "node-red": {     "plugins": {       "mine-status": "mine-status.js"     }   },   "dependencies": {     "@mine-edge/driver-framework": "^0.1.0"   },   "keywords": ["node-red", "monitoring", "status", "edge-gateway"],   "license": "Apache-2.0" }

这套机制带来的工程收益:

  • 协议驱动 = 节点包
    ,16 种协议驱动各自独立演进,互不干扰
  • 平台扩展 = 插件包
    ,状态面板、管理控制台、主备冗余都是插件,随包分发
  • 统一依赖驱动框架
    (@mine-edge/driver-framework),所有驱动共享同一套设备抽象与数据管道

2. 配置工程化:flows.json 是唯一权威源

工业网关的配置是一棵"工程树":工程 → 驱动 → 设备 → 源点/标签。这些配置最终都要变成 Node-RED 的 flows。我们定了一条硬规则(ADR-07):

flows.json 是配置的唯一权威源
,gateway.db中的 drivers / devices / tags 三表只是只读投影(read model),单向同步,禁止反向写入。

实现这个规则的模块叫 ConfigProjector(nodes/common/config-projector.js):

// 同步触发:流部署完成后全量重建三表(事务) RED.events.on('flows:started', () => { projector.rebuild(); }); // 同步方向:单向 flows.json → gateway.db,不反向 // 写入方:仅本模块,其他任何节点/UI 不得直写 // UI 增删改必须走 Node-RED Admin API

这个设计解决了工业项目里最头疼的"配置漂移"问题:界面改配置、手工改 flows、数据库直改,三处不一致。现在只有一条单向管道,投影失败不阻断主流程(gateway.db 只是派生视图),每表带 synced_at字段方便诊断滞后。

3. 控制台:与运行时低耦合的 Vue 3 SPA

Node-RED 自带的编辑器是给"技术人员"用的,但矿山的日常使用者需要业务化的管理界面。我们交付了一个 Vue 3 SPA 管理控制台(web/→ /console),覆盖时序数据采集(工程/驱动/源点/标签/流程编辑)、视频 AI 分析中心、边缘数据分析中心(含告警中心)、系统配置。

集成方式是"低耦合"的:

  • 会话体系独立实现(console-auth:scrypt 口令哈希 + JWT 12 小时有效期),不依赖 Node-RED 默认账号体系
  • 插件只做"反向代理 + 会话校验",业务数据全部来自 Node-RED Admin API 与自定义 REST 端点
  • 前端产物与运行时解耦,升级控制台不用动运行时

4. 热生效:配置变更不重启

矿场作业中"重启网关"代价很高(采集链路中断、报警窗口空窗),所以配置变更必须热生效。我们做了两层:

flows 热部署。Node-RED 天生支持流热部署(deploy 不重启进程),控制台的流程编辑直接走 Admin API 触发。所有自定义节点在 on('close')/ 重部署时优雅释放连接,轮询类节点支持动态增删设备。

运行时配置热加载。节点公共配置(config-hot-reload.js)监听配置文件变更并增量应用;远程配置模块(remote-config.js)更进一步:HMAC-SHA256 签名 + 防重放 + 原子写盘 + 校验失败自动回滚,让平台侧下发的配置也能安全地热生效。

5. 小结

这一层"平台化"把 Node-RED 从"一个流编辑器"变成了"可交付的工业产品":

平台能力
实现方式
关键文件
插件化
独立 npm 包 + node-red.plugins
plugins-links/
配置工程化
flows.json 唯一权威源 + 单向投影
nodes/common/config-projector.js
管理控制台
Vue 3 SPA + 独立会话 + 低耦合集成
web/
、nodes/plugins/mine-console/
热生效
流热部署 + 配置热加载 + 远程配置回滚
config-hot-reload.js
、remote-config.js

下一篇进入驱动框架:16 种工业协议如何共享一个驱动框架——device/driver/pipeline/registry 四件套设计。

相关学习资料