RuleGo高性能規(guī)則引擎
RuleGo是一個(gè)基于Go語(yǔ)言的輕量級(jí)、高性能、嵌入式、可編排組件式規(guī)則引擎。也一個(gè)靈活配置和高度定制化的事件處理框架。可以對(duì)輸入消息進(jìn)行聚合、分發(fā)、過(guò)濾、轉(zhuǎn)換、豐富、執(zhí)行各種動(dòng)作和與第三方系統(tǒng)聯(lián)動(dòng)。
特性
- 輕量級(jí):無(wú)外部中間件依賴(lài),既可以下沉到邊緣服務(wù)器,實(shí)現(xiàn)物聯(lián)網(wǎng)邊緣計(jì)算解決方案,也可以部署在云端,作為規(guī)則引擎服務(wù)。
- 高性能:得益于
Go的高性能特性,另外RuleGo采用協(xié)程池和對(duì)象池等技術(shù)。對(duì)10W條數(shù)據(jù)進(jìn)行JS腳本過(guò)濾->JS腳本數(shù)據(jù)處理->HTTP推送處理,平均用時(shí)9秒。 - 嵌入式:支持把
RuleGo嵌入到現(xiàn)有項(xiàng)目,非入侵式利用其特性。 - 組件化:所有業(yè)務(wù)邏輯都是組件,并能靈活配置和重用它們。
- 規(guī)則鏈:可以靈活地組合和重用不同的組件,實(shí)現(xiàn)高度定制化和可擴(kuò)展性的業(yè)務(wù)流程。
- 流程編排:支持對(duì)規(guī)則鏈進(jìn)行動(dòng)態(tài)編排,你可以把業(yè)務(wù)地封裝成
RuleGo組件,然后通過(guò)搭積木方式實(shí)現(xiàn)你高度變化的業(yè)務(wù)需求。 - 擴(kuò)展簡(jiǎn)單:提供豐富靈活的擴(kuò)展接口和鉤子,如:自定義組件、組件注冊(cè)管理、規(guī)則鏈DSL解析器、協(xié)程池、規(guī)則節(jié)點(diǎn)消息流入/流出回調(diào)、規(guī)則鏈處理結(jié)束回調(diào)。
- 動(dòng)態(tài)加載:支持通過(guò)
Go plugin動(dòng)態(tài)加載組件和擴(kuò)展組件。 - 內(nèi)置常用組件:
消息類(lèi)型Switch,JavaScript Switch,JavaScript過(guò)濾器,JavaScript轉(zhuǎn)換器,HTTP推送,MQTT推送,發(fā)送郵件,日志記錄等組件??梢宰孕袛U(kuò)展其他組件。 - 上下文隔離機(jī)制:可靠的上下文隔離機(jī)制,無(wú)需擔(dān)心高并發(fā)情況下的數(shù)據(jù)串流。
使用場(chǎng)景
RuleGo是一款編排式的規(guī)則引擎,最擅長(zhǎng)去解耦你的系統(tǒng)。
- 如果你的系統(tǒng)業(yè)務(wù)復(fù)雜,并且代碼臃腫不堪
- 如果你的業(yè)務(wù)場(chǎng)景高度定制化或者經(jīng)常變動(dòng)
- 或者需要端對(duì)端的物聯(lián)網(wǎng)解決方案
- 或者需要對(duì)異構(gòu)系統(tǒng)數(shù)據(jù)集中處理
- 或者你想嘗試在
Go語(yǔ)言實(shí)現(xiàn)熱部署......
那RuleGo框架會(huì)是一個(gè)非常好的解決方案。
典型使用場(chǎng)景
- 邊緣計(jì)算: 可以在邊緣服務(wù)器部署
RuleGo,對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,篩選、聚合或者計(jì)算后再上報(bào)到云端。數(shù)據(jù)的處理規(guī)則和分發(fā)規(guī)則可以通過(guò)規(guī)則鏈動(dòng)態(tài)配置和修改,而不需要重啟系統(tǒng)。 - 物聯(lián)網(wǎng): 收集設(shè)備數(shù)據(jù)上報(bào),經(jīng)過(guò)規(guī)則鏈的規(guī)則判斷,觸發(fā)一個(gè)或者多個(gè)動(dòng)作,例如:發(fā)郵件、發(fā)告警、和其他設(shè)備或者系統(tǒng)聯(lián)動(dòng)。
- 數(shù)據(jù)分發(fā): 可以根據(jù)不同的消息類(lèi)型,調(diào)用HTTP、MQTT或者gRPC把數(shù)據(jù)分發(fā)到不同系統(tǒng)。
- 應(yīng)用集成: 把
RuleGo當(dāng)做膠水連接各種系統(tǒng)或者協(xié)議,例如:kafka、消息隊(duì)列、數(shù)據(jù)庫(kù)、chatGPT、第三方應(yīng)用系統(tǒng)。 - 異構(gòu)系統(tǒng)數(shù)據(jù)集中處理: 從不同的數(shù)據(jù)源(如 MQTT、HTTP 等)接收數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行過(guò)濾、格式轉(zhuǎn)換、然后分發(fā)到數(shù)據(jù)庫(kù)、業(yè)務(wù)系統(tǒng)或者儀表板。
- 高度定制化業(yè)務(wù): 把高度定制化或者經(jīng)常變化的業(yè)務(wù)解耦出來(lái),交給
RuleGo規(guī)則鏈進(jìn)行管理。業(yè)務(wù)需求變化而不需要重啟主程序。 - 復(fù)雜業(yè)務(wù)編排: 把業(yè)務(wù)封裝成自定義組件,通過(guò)
RuleGo編排和驅(qū)動(dòng)這些自定義的組件,業(yè)務(wù)邏輯并支持動(dòng)態(tài)調(diào)整和替換。 - 微服務(wù)編排: 通過(guò)
RuleGo編排和驅(qū)動(dòng)微服務(wù),或者動(dòng)態(tài)調(diào)用第三方服務(wù)處理業(yè)務(wù),并返回結(jié)果。 - 業(yè)務(wù)代碼和業(yè)務(wù)邏輯解耦: 例如:用戶積分計(jì)算系統(tǒng)、風(fēng)控系統(tǒng)。
- 自動(dòng)化: 例如:流程自動(dòng)化系統(tǒng)、營(yíng)銷(xiāo)自動(dòng)化系統(tǒng)、對(duì)接
大模型提取用戶意圖,然后觸發(fā)規(guī)則鏈與其他系統(tǒng)進(jìn)行聯(lián)動(dòng)或者進(jìn)行業(yè)務(wù)處理。 - 靈活配置和高度定制化的事件處理框架: 對(duì)不同的消息類(lèi)型,進(jìn)行異步或者同步的處理。
安裝
使用go get命令安裝RuleGo:
go get github.com/rulego/rulego
使用
使用Json格式定義規(guī)則鏈DSL:
{
"ruleChain": {
"name": "測(cè)試規(guī)則鏈",
"root": true
},
"metadata": {
"nodes": [
{
"id": "s1",
"type": "jsFilter",
"name": "過(guò)濾",
"debugMode": true,
"configuration": {
"jsScript": "return msg!='bb';"
}
},
{
"id": "s2",
"type": "jsTransform",
"name": "轉(zhuǎn)換",
"debugMode": true,
"configuration": {
"jsScript": "metadata['test']='test02';\\\\n metadata['index']=50;\\\\n msgType='TEST_MSG_TYPE2';\\\\n var msg2=JSON.parse(msg);\\\\n msg2['aa']=66;\\\\n return {'msg':msg2,'metadata':metadata,'msgType':msgType};"
}
},
{
"id": "s3",
"type": "restApiCall",
"name": "推送數(shù)據(jù)",
"debugMode": true,
"configuration": {
"restEndpointUrlPattern": "http://192.168.216.21:9099/api/socket/msg",
"requestMethod": "POST",
"maxParallelRequestsCount": 200
}
}
],
"connections": [
{
"fromId": "s1",
"toId": "s2",
"type": "True"
},
{
"fromId": "s2",
"toId": "s3",
"type": "Success"
}
],
"ruleChainConnections": null
}
}
導(dǎo)入RuleGo包并創(chuàng)建一個(gè)規(guī)則引擎實(shí)例:
import "github.com/rulego/rulego"
//創(chuàng)建一個(gè)規(guī)則引擎實(shí)例,每個(gè)規(guī)則引擎實(shí)例有且只有一個(gè)根規(guī)則鏈
ruleEngine, err := rulego.New("rule01", []byte(ruleFile))
把消息、消息類(lèi)型、消息元數(shù)據(jù)交給規(guī)則引擎實(shí)例處理:
//定義消息元數(shù)據(jù)
metaData := types.NewMetadata()
metaData.PutValue("productType", "test01")
//定義消息和消息類(lèi)型
msg := types.NewMsg(0, "TELEMETRY_MSG", types.JSON, metaData, "{\\"temperature\\":35}")
//把消息交給規(guī)則引擎處理
ruleEngine.OnMsg(msg)
//需要得到結(jié)束回調(diào)的調(diào)用方式
ruleEngine.OnMsgWithOptions(msg,types.WithEndFunc(func(msg types.RuleMsg, err error) {
//規(guī)則鏈異步回調(diào)結(jié)果
//注意:規(guī)則鏈如果有多個(gè)分支結(jié)束點(diǎn),會(huì)調(diào)用多次
}))
//帶context.Context的調(diào)用方式,用于不同組件實(shí)例共享數(shù)據(jù)
ruleEngine.OnMsgWithOptions(msg,types.WithContext(context.WithValue(context.Background(), "shareKey", "shareValue")))
支持規(guī)則鏈類(lèi)型:
順序執(zhí)行:
異步+順序執(zhí)行:
使用子規(guī)則鏈方式:
一些復(fù)雜例子:
源代碼/文檔:
評(píng)論
圖片
表情
