RuleGo

RuleGo

GoDoc Go Report codecov test build build QQ-720103251 Mentioned in Awesome Go

English| 简体中文

官方网站 | 文档 | 贡献指南

logo

RuleGo 是一个基于Go语言打造的轻量级、高性能、嵌入式、可编排组件式的规则引擎。

它可以帮助你快速实现松耦合、灵活可变的系统,实时响应和调整业务需求的变化。

RuleGo 还提供大量可复用的组件,支持数据聚合、分流、分发、转换、丰富和执行各种动作,还能与各种协议和系统进行交互和集成。 在低代码、业务编排、数据集成、工作流、大模型智能体、边缘计算、自动化、物联网等场景具有广泛的应用潜力。

特性

  • 轻量级: 无外部中间件依赖,在低成本设备上高效处理数据和联动,适合物联网边缘计算。
  • 高性能: 得益于Go语言的高性能特性,RuleGo还采用协程池、对象池等技术。
  • 双模式: 嵌入式与独立部署模式。支持将 RuleGo 嵌入到现有应用中。也可以独立部署为中间件,提供规则引擎和编排服务。
  • 组件化: 所有业务逻辑都是组件化,灵活配置和复用。
  • 规则链: 灵活组合和复用不同组件,实现高度定制化和可扩展的业务流程。
  • 工作流编排: 支持动态编排规则链组件,替换或新增业务逻辑无需重启应用。
  • 易扩展: 提供丰富灵活的扩展接口,可轻松实现自定义组件或引入第三方组件。
  • 动态加载: 支持通过Go插件动态加载组件和扩展。
  • 嵌套规则链: 支持嵌套子规则链,复用流程。
  • 内置组件: 包含大量组件,如消息类型切换JavaScript SwitchJavaScript过滤器JavaScript转换器HTTP推送MQTT推送发送邮件日志记录等。其他组件可按需扩展。
  • 上下文隔离机制: 可靠的上下文隔离机制,无需担心高并发数据流窜问题。
  • AOP机制: 可以在规则链或节点执行时添加额外行为,或者直接替换规则链或节点的原有逻辑,而无需修改其原有逻辑。
  • 数据集成: 支持动态配置Endpoint,如HTTP EndpointMQTT EndpointTCP/UDP EndpointUDP EndpointKafka EndpointSchedule 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步:

  1. 使用JSON定义规则链:

  2. 导入RuleGo包并使用规则链定义创建规则引擎实例:

import "github.com/rulego/rulego"
//加载规则链定义文件
ruleFile := fs.LoadFile("chain_call_rest_api.json")
// 使用规则链定义创建规则引擎实例
ruleEngine, err := rulego.New("rule01", ruleFile)
  1. 把消息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

规则链定义DSL

规则链节点组件

RuleGo 的核心特性是组件化架构,所有业务逻辑都封装在组件中,可以灵活配置和复用。目前, RuleGo 已内置大量常用组件。

数据集成

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 使用Apache 2.0许可证,详情请参阅LICENSE文件。

联系我们

邮箱:rulego@outlook.com

posted on 2026-06-28 16:44  漫思  阅读(9)  评论(0)    收藏  举报

导航