RuleGo
RuleGo
English| 简体中文
RuleGo 是一个基于Go语言打造的轻量级、高性能、嵌入式、可编排组件式的规则引擎。
它可以帮助你快速实现松耦合、灵活可变的系统,实时响应和调整业务需求的变化。
RuleGo 还提供大量可复用的组件,支持数据聚合、分流、分发、转换、丰富和执行各种动作,还能与各种协议和系统进行交互和集成。 在低代码、业务编排、数据集成、工作流、大模型智能体、边缘计算、自动化、物联网等场景具有广泛的应用潜力。
特性
- 轻量级: 无外部中间件依赖,在低成本设备上高效处理数据和联动,适合物联网边缘计算。
- 高性能: 得益于Go语言的高性能特性,RuleGo还采用协程池、对象池等技术。
- 双模式: 嵌入式与独立部署模式。支持将
RuleGo嵌入到现有应用中。也可以独立部署为中间件,提供规则引擎和编排服务。 - 组件化: 所有业务逻辑都是组件化,灵活配置和复用。
- 规则链: 灵活组合和复用不同组件,实现高度定制化和可扩展的业务流程。
- 工作流编排: 支持动态编排规则链组件,替换或新增业务逻辑无需重启应用。
- 易扩展: 提供丰富灵活的扩展接口,可轻松实现自定义组件或引入第三方组件。
- 动态加载: 支持通过Go插件动态加载组件和扩展。
- 嵌套规则链: 支持嵌套子规则链,复用流程。
- 内置组件: 包含大量组件,如
消息类型切换、JavaScript Switch、JavaScript过滤器、JavaScript转换器、HTTP推送、MQTT推送、发送邮件、日志记录等。其他组件可按需扩展。 - 上下文隔离机制: 可靠的上下文隔离机制,无需担心高并发数据流窜问题。
- AOP机制: 可以在规则链或节点执行时添加额外行为,或者直接替换规则链或节点的原有逻辑,而无需修改其原有逻辑。
- 数据集成: 支持动态配置Endpoint,如
HTTP Endpoint、MQTT Endpoint、TCP/UDP Endpoint、UDP Endpoint、Kafka Endpoint、Schedule Endpoint等。
使用场景
RuleGo 是一个可编排的规则引擎,擅长解耦你的系统。
- 如果你的系统业务复杂,代码臃肿
- 如果你的业务场景高度定制化或者经常变动
- 如果你的系统需要对接大量第三方应用或协议
- 或者你需要端到端的物联网解决方案
- 或者你需要集中处理异构系统数据
- 或者你想尝试Go语言热部署... 那么RuleGo框架将是非常好的解决方案。
典型使用场景
- 边缘计算: 在边缘服务器部署RuleGo,对数据进行预处理、过滤、聚合或者计算后再上报到云端。数据处理的规则和分发规则可以通过规则链动态配置和修改,无需重启系统。
- 物联网: 收集设备数据上报,通过规则链做规则判断,然后触发一个或者多个动作,例如发送邮件、告警、联动其他设备或者系统。
- 数据分发: 根据不同的消息类型,通过HTTP、MQTT或者gRPC把数据分发到不同系统。
- 应用集成: 使用RuleGo作为粘合剂来连接各种系统或协议,例如SSH、webhook、Kafka、消息队列、数据库、ChatGPT、第三方应用系统。
- 异构系统数据集中处理: 接收来自不同来源的数据(如MQTT、HTTP、WS、TCP/UDP等),然后进行过滤、格式转换后分发到数据库、业务系统或者大屏。
- 高度定制化业务: 把高度定制化或者经常变动的业务解耦出来,交给RuleGo规则链管理。业务需求变动不需要重启主程序。
- 复杂业务编排: 把业务封装成自定义组件,通过RuleGo编排和驱动这些自定义组件,支持动态调整和替换业务逻辑。
- 微服务编排: 通过RuleGo编排和驱动微服务,或者动态调用第三方服务处理业务并返回结果。
- 业务代码与逻辑解耦: 例如用户积分系统、风控系统。
- 自动化: 例如CI/CD系统、流程自动化系统、营销自动化系统。
- 低代码: 例如低代码平台、iPaaS系统、ETL、类似LangFlow系统(对接大模型提取用户意图,然后触发规则链与其他系统交互或处理业务)。
架构图
RuleGo架构图
规则链运行示例图
安装
使用 go get 命令安装 RuleGo:
go get github.com/rulego/rulego
# 或
go get gitee.com/rulego/rulego
使用
RuleGo 使用极其简单,只需3步:
-
使用JSON定义规则链:
-
导入RuleGo包并使用规则链定义创建规则引擎实例:
import "github.com/rulego/rulego"
//加载规则链定义文件
ruleFile := fs.LoadFile("chain_call_rest_api.json")
// 使用规则链定义创建规则引擎实例
ruleEngine, err := rulego.New("rule01", ruleFile)
- 把消息payload、消息类型、消息metadata交给规则引擎实例处理,然后规则引擎就会根据规则链的定义处理消息:
//定义消息metadata
metaData := types.NewMetadata()
metaData.PutValue("productType", "test01")
//定义消息payload和消息类型
msg := types.NewMsg(0, "TELEMETRY_MSG", types.JSON, metaData, "{\"temperature\":35}")
//把消息交给规则引擎处理
ruleEngine.OnMsg(msg)
实时更新规则链逻辑而无需重启应用
规则引擎管理API
- 动态更新规则链
//动态更新规则链逻辑
err := ruleEngine.ReloadSelf(ruleFile)
//更新规则链下某个节点
ruleEngine.ReloadChild("node01", nodeFile)
//获取规则链定义
ruleEngine.DSL()
- 规则引擎实例管理:
//加载文件夹所有规则链定义到规则引擎池
rulego.Load("/rules", rulego.WithConfig(config))
//通过ID获取已经创建的规则引擎实例
ruleEngine, ok := rulego.Get("rule01")
//删除已经创建的规则引擎实例
rulego.Del("rule01")
- 配置:文档
//创建默认配置
config := rulego.NewConfig()
//调试节点回调函数,节点配置必须设置debugMode:true才会触发调用
//节点进入和离开信息都会回调该函数
config.OnDebug = func (chainId,flowType string, nodeId string, msg types.RuleMsg, relationType string, err error) {
}
//使用配置
ruleEngine, err := rulego.New("rule01", []byte(ruleFile), rulego.WithConfig(config))
规则链定义DSL
规则链节点组件
RuleGo 的核心特性是组件化架构,所有业务逻辑都封装在组件中,可以灵活配置和复用。目前, RuleGo 已内置大量常用组件。
- 标准组件
- rulego-components :文档
- rulego-components-ai
- rulego-components-ci
- rulego-components-iot
- rulego-components-etl
- rulego-marketplace :动态组件和规则链市场
- 自定义节点组件示例 :文档
数据集成
RuleGo 提供Endpoint模块,用于异构系统的统一数据接入与处理。详情参考:Endpoint
输入端点组件
RuleGo-Server
我们基于RuleGo提供了开箱即用的自动化工作流平台:RuleGo-Server , 以及前端可视化编辑器:RuleGo-Editor 。
性能
RuleGo 在初始化阶段完成大部分工作,因此运行规则链几乎不会给系统增加额外开销,资源消耗极低,特别适合运行在边缘服务器上。 另外RuleGo使用有向无环图(DAG)来表示规则链,每个输入消息只需要沿着图中的路径进行处理,而不需要匹配所有规则,这大大提高了消息处理和路由的效率,同时也节省了系统资源。
性能测试用例:
机器:树莓派2 (900MHz Cortex-A7*4,1GB LPDDR2)
数据大小:260B
规则链:JS脚本过滤->JS复杂转换->HTTP推送
测试结果:100并发和500并发,内存消耗变化不大,在19M左右
生态
- RuleGo-Editor : 规则链可视化编辑器
- RuleGo-Server : 自动化工作流平台
- rulego-components : 扩展组件库
- rulego-components-ai : AI场景组件库
- rulego-components-ci : CI/CD场景组件库
- rulego-components-iot : 物联网场景组件库
- rulego-components-etl : ETL场景组件库
- rulego-marketplace : 动态组件和规则链市场
贡献
欢迎任何形式的贡献,包括提交问题、建议、文档、测试或代码。贡献指南
许可证
RuleGo 使用Apache 2.0许可证,详情请参阅LICENSE文件。
联系我们
邮箱:rulego@outlook.com
浙公网安备 33010602011771号