快速开始
# 安装
使用go get
命令安装RuleGo
:
go get github.com/rulego/rulego
1
# 使用
首先使用Json格式定义规则链。规则链的定义不需要学习特定的规则语法或者DSL,只需配置组件,并把他们通过一定的关系连接起来,即可实现你的功能需求。参考规则链
RuleGo 使用极其简单和轻量级。只需以下2步:
- 导入
RuleGo
包,并使用规则链定义,创建一个规则引擎实例:
以下示例是一个简单的规则链定义,它包含一个过滤器、一个转换器、一个推送数据组件,
它会过滤掉设备ID为aa
的设备数据,并对数据进行转换,然后把设备ID为aa
的设备数据推送到远程服务器。
import "github.com/rulego/rulego"
var ruleFile=`{
{
"ruleChain": {
"id":"chain_call_rest_api",
"name": "测试规则链",
"root": true
},
"metadata": {
"nodes": [
{
"id": "s1",
"type": "jsFilter",
"name": "过滤",
"debugMode": true,
"configuration": {
"jsScript": "return msg.deviceId=='aa';"
}
},
{
"id": "s2",
"type": "jsTransform",
"name": "转换",
"debugMode": true,
"configuration": {
"jsScript": "msg.temperature=msg.temperature/10; return {'msg':msg,'metadata':metadata,'msgType':msgType};"
}
},
{
"id": "s3",
"type": "restApiCall",
"name": "推送数据",
"debugMode": true,
"configuration": {
"restEndpointUrlPattern": "http://192.168.1.1:9099/api/msg",
"requestMethod": "POST",
"maxParallelRequestsCount": 200
}
}
],
"connections": [
{
"fromId": "s1",
"toId": "s2",
"type": "True"
},
{
"fromId": "s2",
"toId": "s3",
"type": "Success"
}
]
}
}
}
`
//使用规则链定义,创建一个规则引擎实例
ruleEngine, err := rulego.New("rule01", []byte(ruleFile))
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
55
56
57
58
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
55
56
57
58
- 把消息交给规则引擎实例处理(消息包括:消息负荷、消息类型、消息元数据等),然后规则引擎就会根据规则链的定义处理消息:
//定义消息元数据
metaData := types.NewMetadata()
metaData.PutValue("productType", "test01")
//定义消息负荷和消息类型
msg := types.NewMsg(0, "telemetry_msg", types.JSON, metaData, "{\"deviceId\":\"aa\",\"temperature\":290}")
//把消息交给规则引擎处理
ruleEngine.OnMsg(msg)
//继续处理消息,并通过回调函数得到规则链处理结果
msg = types.NewMsg(0, "telemetry_msg", types.JSON, metaData, "{\"deviceId\":\"bb\",\"temperature\":310}", types.WithOnEnd(
func(ctx types.RuleContext, msg types.RuleMsg, err error, relationType string) {
fmt.Println(msg.Data)//得到处理结果
}))
ruleEngine.OnMsg(msg)
//处理设备告警类型消息
msg = types.NewMsg(0, "device_alarm", types.JSON, metaData, "{\"deviceId\":\"bb\",\"alarm\":1}")
ruleEngine.OnMsg(msg)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
规则链支持动态热更新:
//通过规则链ID获取已经创建的规则引擎实例
ruleEngine, ok := rulego.Get("rule01")
//更新规则链,可以修改现有节点配置、添加、删除节点以及他们的连接关系
updateRuleChainFile:=`{
//...其他配置不变化
//变更节点s2 把温度温度加5
{
"id": "s2",
"type": "jsTransform",
"name": "转换",
"debugMode": true,
"configuration": {
"jsScript": "msg.temperature=msg.temperature/10+5; return {'msg':msg,'metadata':metadata,'msgType':msgType};"
}
}
//...其他配置和连接不变化
}
`
//热更新规则引擎实例
_ = ruleEngine.ReloadSelf([]byte(updateRuleChainFile))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 其他
- 我们内置了大量的标准组件 和 扩展组件 ,你只需要通过配置的方式组合这些组件,实现你的功能需求。
- 你也可以很容易地开发自己的组件,参考 自定义组件 。
- 我们也提供了一个可独立部署轻量级的规则引擎服务 ,可以让你不需要写代码,只要编写规则链,实现你的需求。支持通过HTTP接口执行规则链。
# 小结
RuleGo 使用极其简单和轻量级。只需以下2步:
- 1.使用Json格式的规则链定义业务逻辑,并根据该规则链初始化规则引擎。
- 2.然后把消息或者事件交给规则引擎实例,每条消息或者事件就会按照规则链定义的逻辑进行处理,规则链支持热更新。
RuleGo 虽然轻但很强大,我们继续阅读其他章节往下探索......
在 GitHub 上编辑此页 (opens new window)
上次更新: 2025/03/06, 01:40:00