动态组件
# 动态组件概述
RuleGo 规则链的组件除了原生组件(nc)外,还可以通过JSON DSL方式实现的动态组件(dc)。动态组件本质是子规则链,通过组合和编排现有组件,实现一个新的组件,并提供给规则链使用。
动态组件的特点是:
- 可以动态安装、升级、卸载组件。
- 通过JSON DSL定义组件,不需要编译,方便发布和升级。
- 可以把子规则链转换成组件。
- 对现在组件的二次封装和扩展。
- 可以通过组件市场 (opens new window) 在线安装和升级动态组件。
# 动态组件实现
通过以下步骤实现动态组件:
# 1. 通过子规则链DSL定义组件
示例:
{
"ruleChain": {
"id": "dataTransform", // 组件类型标识
"name": "温度转换",// 组件名称
"root": false,//定义成子规则链
"additionalInfo": { // 组件元数据
"category": "custom", // 组件分类
"icon": "custom-node", // 组件图标
"description": "温度转换组件", // 组件描述
"relationTypes": ["Success"], // 允许和下一个组件连接的关系类型
"author": "admin",
"version": "1.0.0",
"inputSchema": { // 参数配置定义(JSON Schema)
"type": "object",
"properties": { //组件参数定义
"scaleFactor": {
"type": "number",// 参数类型 支持(number,string,bool,object,array)
"title": "换算系数",//标题
"default": 1.8 //默认值
}
}
}
}
},
"metadata": { // 组件逻辑实现
"nodes": [
{
"type": "jsTransform",
"configuration": {
"jsScript": "msg.temperature = msg.temperature * ${vars.scaleFactor} + 32; return {'msg':msg,'metadata':metadata,'msgType':msgType};" // 通过${vars.fieldName}引用组件参数
}
}],
"connections": []
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
动态组件DSL和规则链的DSL 一致。其中:
ruleChain.id
:组件类型标识,用于唯一标识组件类型,规则链通过该标识使用组件。可以使用命名空间的方式定义组件类型标识,例如:x/dataTransformruleChain.additionalInfo
描述组件的元数据,包括组件的分类、图标、描述、关系类型、输入参数配置等。
additionalInfo 对象
字段名 | 类型 | 必填 | 描述 | 默认值 |
---|---|---|---|---|
category | 字符串 | 否 | 组件分类,对组件进行分类,帮助用户快速定位所需组件类型。 | custom |
icon | 字符串 | 否 | 组件图标,用户界面上显示的图标,通常为图标类名或路径。 | custom-node |
description | 字符串 | 否 | 组件描述,对组件功能的简要说明,帮助用户了解组件用途。 | |
relationTypes | 数组 | 否 | 和下一个组件允许的关系类型。 | ["Success","Failure"] |
author | 字符串 | 否 | 作者。 | |
version | 字符串 | 否 | 版本。 | |
inputSchema | JSON Schema | 否 | 组件参数配置定义,定义组件输入参数结构,遵循JSON Schema格式,指定参数类型、标题、默认值等。 | 详见inputSchema表 |
inputSchema: 组件参数配置如果不存在,则系统通过扫描${vars.fieldName}
自动生成
inputSchema 对象
字段名 | 类型 | 必填 | 描述 | 示例值 |
---|---|---|---|---|
type | 字符串 | 是 | 参数类型,指定参数类型,支持number、string、bool、object、array等类型。 | "number" |
properties | 对象 | 否 | 参数属性,定义各个参数的具体属性。 | 详见properties表 |
properties 对象
字段名 | 类型 | 必填 | 描述 | 示例值 |
---|---|---|---|---|
type | 字符串 | 否 | 参数类型,指定该参数的类型。 | "number" |
title | 字符串 | 否 | 参数标题,参数的显示名称。 | "换算系数" |
default | 数字 | 否 | 参数默认值,参数的默认值。 | 1.8 |
# 2. 通过编排和组合已有的组件实现组件逻辑:
通过metadata.nodes
和metadata.connections
组合和编排已有的组件实现组件逻辑(和规则链实现逻辑一样)。
# 3. 把组件DSL注册到引擎中:
// 通过dsl定义组件:
// componentType:组件类型标识,用于唯一标识组件类型,规则链通过该标识使用组件。
// dsl:组件DSL
dynamicNode := NewDynamicNode(componentType, dsl)
Registry.Register(dynamicNode)
1
2
3
4
5
2
3
4
5
# 4. 规则链使用组件:
{
"ruleChain": {
"id": "9ehrY6tXl3y6",
"name": "测试动态组件",
"debugMode": false,
"root": false,
"disabled": false,
"additionalInfo": {
"createTime": "2025/03/26 15:42:39",
"layoutX": "280",
"layoutY": "280",
"updateTime": "2025/03/26 15:42:39",
"username": "admin"
}
},
"metadata": {
"endpoints": [],
"nodes": [
{
"id": "node_2",
"additionalInfo": {
"layoutX": 610,
"layoutY": 250
},
"type": "dataTransform",
"name": "转换温度",
"debugMode": false,
"configuration": {
"scaleFactor": 1.8
}
},
{
"id": "node_4",
"additionalInfo": {
"layoutX": 920,
"layoutY": 260
},
"type": "log",
"name": "打印日志",
"debugMode": false,
"configuration": {
"jsScript": "return 'Incoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"
}
}
],
"connections": [
{
"fromId": "node_2",
"toId": "node_4",
"type": "Success"
}
]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
在 GitHub 上编辑此页 (opens new window)
上次更新: 2025/03/26, 10:23:41