rulego

package module
v0.35.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 21, 2026 License: Apache-2.0 Imports: 5 Imported by: 24

README

RuleGo

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

English| 简体中文

Official Website | Docs | Contribution Guide

logo

RuleGo is a lightweight, high-performance, embedded, orchestrable component-based rule engine built on the Go language.

It can help you quickly build loosely coupled and flexible systems that can respond and adjust to changes in business requirements in real time.

RuleGo also provides a large number of reusable components that support the aggregation, filtering, distribution, transformation, enrichment, and execution of various actions on data, and can also interact and integrate with various protocols and systems. It has a wide range of application potential in low-code, business code orchestration, data integration, workflows, large model intelligent agents, edge computing, automation, IoT, and other scenarios.

Features

  • Lightweight: No external middleware dependencies, efficient data processing and linkage on low-cost devices, suitable for IoT edge computing.
  • High Performance: Thanks to Go's high-performance characteristics, RuleGo also employs technologies such as coroutine pools and object pools.
  • Dual Mode: Embedded and Standalone Deployment modes. Supports embedding RuleGo into existing applications. It can also be deployed independently as middleware, providing rule engine and orchestration services.
  • Componentized: All business logic is component-based, allowing flexible configuration and reuse.
  • Rule Chains: Flexibly combine and reuse different components to achieve highly customized and scalable business processes.
  • Workflow Orchestration: Supports dynamic orchestration of rule chain components, replacing or adding business logic without restarting the application.
  • Easy Extension: Provides rich and flexible extension interfaces, making it easy to implement custom components or introduce third-party components.
  • Dynamic Loading: Supports dynamic loading of components and extensions through Go plugins.
  • Nested Rule Chains: Supports nesting of sub-rule chains to reuse processes.
  • Built-in Components: Includes a large number of components such as Message Type Switch, JavaScript Switch, JavaScript Filter, JavaScript Transformer, HTTP Push, MQTT Push, Send Email, Log Recording, etc. Other components can be extended as needed.
  • Context Isolation Mechanism: Reliable context isolation mechanism, no need to worry about data streaming in high concurrency situations.
  • AOP Mechanism: Allows adding extra behavior to the execution of rule chains or directly replacing the original logic of rule chains or nodes without modifying their original logic.
  • Data Integration: Allows dynamic configuration of Endpoints, such as HTTP Endpoint, MQTT Endpoint, TCP/UDP Endpoint, UDP Endpoint, Kafka Endpoint, Schedule Endpoint, etc.

Use Cases

RuleGo is an orchestrable rule engine that excels at decoupling your systems.

  • If your system's business is complex and the code is bloated
  • If your business scenarios are highly customized or frequently changing
  • If your system needs to interface with a large number of third-party applications or protocols
  • Or if you need an end-to-end IoT solution
  • Or if you need centralized processing of heterogeneous system data
  • Or if you want to try hot deployment in the Go language... Then the RuleGo framework will be a very good solution.
Typical Use Cases
  • Edge Computing: Deploy RuleGo on edge servers to preprocess data, filter, aggregate, or compute before reporting to the cloud. Data processing rules and distribution rules can be dynamically configured and modified through rule chains without restarting the system.
  • IoT: Collect device data reports, make rule judgments through rule chains, and trigger one or more actions, such as sending emails, alarms, and linking with other devices or systems.
  • Data Distribution: Distribute data to different systems using HTTP, MQTT, or gRPC based on different message types.
  • Application Integration: Use RuleGo as glue to connect various systems or protocols, such as SSH, webhook, Kafka, message queues, databases, ChatGPT, third-party application systems.
  • Centralized Processing of Heterogeneous System Data: Receive data from different sources (such as MQTT, HTTP, WS, TCP/UDP, etc.), then filter, format convert, and distribute to databases, business systems, or dashboards.
  • Highly Customized Business: Decouple highly customized or frequently changing business and manage it with RuleGo rule chains. Business requirements change without needing to restart the main program.
  • Complex Business Orchestration: Encapsulate business into custom components, orchestrate and drive these custom components through RuleGo, and support dynamic adjustment and replacement of business logic.
  • Microservice Orchestration: Orchestrate and drive microservices through RuleGo, or dynamically call third-party services to process business and return results.
  • Decoupling of Business Code and Logic: For example, user points calculation systems, risk control systems.
  • Automation: For example, CI/CD systems, process automation systems, marketing automation systems.
  • Low Code: For example, low-code platforms, iPaaS systems, ETL, LangFlow-like systems (interfacing with large models to extract user intent, then triggering rule chains to interact with other systems or process business).

Architecture Diagram

RuleGo Architecture Diagram

Rule Chain Running Example Diagram

More Running Modes

Installation

Install RuleGo using the go get command:

go get github.com/rulego/rulego
# or
go get gitee.com/rulego/rulego

Usage

RuleGo is extremely simple to use. Just follow these 3 steps:

  1. Define rule chains using JSON:

  2. Import the RuleGo package and use the rule chain definition to create a rule engine instance:

import "github.com/rulego/rulego"
//Load the rule chain definition file.
ruleFile := fs.LoadFile("chain_call_rest_api.json")
// Create a rule engine instance using the rule chain definition
ruleEngine, err := rulego.New("rule01", ruleFile)
  1. Hand over the message payload, message type, and message metadata to the rule engine instance for processing, and then the rule engine will process the message according to the rule chain's definition:
// Define message metadata
metaData := types.NewMetadata()
metaData.PutValue("productType", "test01")
// Define message payload and message type
msg := types.NewMsg(0, "TELEMETRY_MSG", types.JSON, metaData, "{\"temperature\":35}")

// Hand over the message to the rule engine for processing
ruleEngine.OnMsg(msg)

Real time update of rule chain logic without restarting the application

Rule Engine Management API
  • Dynamically update rule chains
// Dynamically update rule chain logic
err := ruleEngine.ReloadSelf(ruleFile)
// Update a node under the rule chain
ruleEngine.ReloadChild("node01", nodeFile)
// Get the rule chain definition
ruleEngine.DSL()
  • Rule Engine Instance Management:
// Load all rule chain definitions in a folder into the rule engine pool
rulego.Load("/rules", rulego.WithConfig(config))
// Get an already created rule engine instance by ID
ruleEngine, ok := rulego.Get("rule01")
// Delete an already created rule engine instance
rulego.Del("rule01")
// Create a default configuration
config := rulego.NewConfig()
// Debug node callback, the node configuration must be set to debugMode:true to trigger the call
// Both node entry and exit information will call this callback function
config.OnDebug = func (chainId,flowType string, nodeId string, msg types.RuleMsg, relationType string, err error) {
}
// Use the configuration
ruleEngine, err := rulego.New("rule01", []byte(ruleFile), rulego.WithConfig(config))
Rule Chain Definition DSL

Rule Chain Definition DSL

Rule Chain Node Components

The core feature of RuleGo is its component-based architecture, where all business logic is encapsulated in components that can be flexibly configured and reused. Currently, RuleGo has built-in a vast array of commonly used components.

Data Integration

RuleGo provides the Endpoint module for unified data integration and processing of heterogeneous systems. For details, refer to: Endpoint

Input Endpoint Components
RuleGo-Server

We have provided a ready-to-use automation workflow platform based on RuleGo: RuleGo-Server , and a front-end visual editor: RuleGo-Editor .

Performance

RuleGo completes most of its work during initialization, so running the rule chain almost doesn't add extra overhead to the system, and the resource consumption is extremely low, making it particularly suitable for running on edge servers. Additionally, RuleGo uses Directed Acyclic Graph (DAG) to represent the rule chain, where each input message only needs to be processed along the path in the graph without matching all the rules, which greatly improves the efficiency of message processing and routing, and also saves system resources.

Performance test cases:

Machine: Raspberry Pi 2 (900MHz Cortex-A7*4,1GB LPDDR2)  
Data size: 260B   
Rule chain: JS script filtering->JS complex transformation->HTTP push   
Test results: 100 concurrent and 500 concurrent, memory consumption does not change much around 19M

More performance test cases

Ecosystem

Contribution

Any form of contribution is welcome, including submitting issues, suggestions, documentation, tests or code. Contribution Guide

License

RuleGo uses Apache 2.0 license, please refer to LICENSE file for details.

Contact Us

Email: rulego@outlook.com

Documentation

Overview

Package rulego provides a lightweight, high-performance, embedded, orchestrable component-based rule engine.

Usage

Implement your business requirements by configuring components in the rule chain, and support dynamic modification. Rule chain definition format:

{
	  "ruleChain": {
		"id":"rule01"
	  },
	  "metadata": {
	    "nodes": [
	    ],
		"connections": [
		]
	 }
}

nodes:configure components. You can use built-in components and third-party extension components without writing any code.

connections:configure the relation type between components. Determine the data flow.

Example:

var ruleFile = `
{
	"ruleChain": {
	"id":"rule02",
	"name": "test",
	"root": true
	},
	"metadata": {
	"nodes": [
		{
		"id": "s1",
		"type": "jsTransform",
		"name": "transform",
		"debugMode": true,
		"configuration": {
			"jsScript": "metadata['state']='modify by js';\n msg['addField']='addValueFromJs'; return {'msg':msg,'metadata':metadata,'msgType':msgType};"
			}
		},
		{
			"id": "s2",
			"type": "restApiCall",
			"name": "push data",
			"debugMode": true,
			"configuration": {
				"restEndpointUrlPattern": "http://127.0.0.1:9090/api/msg",
				"requestMethod": "POST",
			}
		}
	],
	"connections": [
		{
			"fromId": "s1",
			"toId": "s2",
			"type": "Success"
		}
	]
	}
}
`

Create Rule Engine Instance

ruleEngine, err := rulego.New("rule01", []byte(ruleFile))

Define Message Metadata

metaData := types.NewMetadata()
metaData.PutValue("productType", "test01")

Define Message Payload And Type

msg := types.NewMsg(0, "TELEMETRY_MSG", types.JSON, metaData, "{\"temperature\":35}")

Processing Message

ruleEngine.OnMsg(msg)

Update Rule Chain

err := ruleEngine.ReloadSelf([]byte(ruleFile))

Load All Rule Chain

err := ruleEngine.Load("./rulechains")

Get Engine Instance

ruleEngine, ok := rulego.Get("rule01")

Index

Constants

This section is empty.

Variables

View Source
var Endpoints = endpoint.DefaultPool
View Source
var Registry = engine.Registry

Registry is the default registrar for rule engine components.

View Source
var Rules = &RuleGo{pool: engine.DefaultPool}

Rules is the default instance of RuleGo with the rule engine pool set to the default pool.

Functions

func Del

func Del(id string)

Del removes a rule engine instance by its ID.

func Get

func Get(id string) (types.RuleEngine, bool)

Get retrieves a rule engine instance by its ID.

func Load added in v0.14.0

func Load(folderPath string, opts ...types.RuleEngineOption) error

Load loads all rule chain configurations from the specified folder and its subFolders into the rule engine instance pool. The rule chain ID is taken from the ruleChain.id specified in the rule chain file.

func New

func New(id string, rootRuleChainSrc []byte, opts ...types.RuleEngineOption) (types.RuleEngine, error)

New creates a new RuleEngine and stores it in the RuleGo rule chain pool.

func NewConfig

func NewConfig(opts ...types.Option) types.Config

NewConfig creates a new Config and applies the options.

func OnMsg added in v0.15.0

func OnMsg(msg types.RuleMsg)

OnMsg calls all rule engine instances to process a message. All rule chains in the rule engine instance pool will attempt to process the message.

func Range added in v0.20.0

func Range(f func(key, value any) bool)

Range iterates over all rule engine instances.

func Reload added in v0.20.0

func Reload(opts ...types.RuleEngineOption)

Reload reloads all rule engine instances.

func Stop

func Stop()

Stop releases all rule engine instances.

func WithConfig

func WithConfig(config types.Config) types.RuleEngineOption

WithConfig is an option that sets the Config of the RuleEngine.

Types

type RuleGo

type RuleGo struct {
	// contains filtered or unexported fields
}

RuleGo is a pool of rule engine instances.

func NewRuleGo added in v0.26.0

func NewRuleGo() *RuleGo

NewRuleGo creates a new RuleGo instance.

func (*RuleGo) Del

func (g *RuleGo) Del(id string)

Del removes a rule engine instance by its ID.

func (*RuleGo) Get

func (g *RuleGo) Get(id string) (types.RuleEngine, bool)

Get retrieves a rule engine instance by its ID.

func (*RuleGo) Load added in v0.14.0

func (g *RuleGo) Load(folderPath string, opts ...types.RuleEngineOption) error

Load loads all rule chain configurations from the specified folder and its subFolders into the rule engine instance pool. The rule chain ID is taken from the ruleChain.id specified in the rule chain file.

func (*RuleGo) New

func (g *RuleGo) New(id string, rootRuleChainSrc []byte, opts ...types.RuleEngineOption) (types.RuleEngine, error)

New creates a new RuleEngine and stores it in the RuleGo rule chain pool. If the specified id is empty (""), the ruleChain.id from the rule chain file is used.

func (*RuleGo) OnMsg added in v0.15.0

func (g *RuleGo) OnMsg(msg types.RuleMsg)

OnMsg calls all rule engine instances to process a message. All rule chains in the rule engine instance pool will attempt to process the message.

func (*RuleGo) Pool added in v0.26.0

func (g *RuleGo) Pool() *engine.Pool

Pool returns the rule engine pool.

func (*RuleGo) Range added in v0.20.0

func (g *RuleGo) Range(f func(key, value any) bool)

Range iterates over all rule engine instances.

func (*RuleGo) Reload added in v0.21.0

func (g *RuleGo) Reload(opts ...types.RuleEngineOption)

Reload reloads all rule engine instances.

func (*RuleGo) SetCallbacks added in v0.30.0

func (g *RuleGo) SetCallbacks(callbacks types.Callbacks)

SetCallbacks sets the callbacks for the rule engine pool.

func (*RuleGo) Stop

func (g *RuleGo) Stop()

Stop releases all rule engine instances.

Directories

Path Synopsis
api
types
Package types defines the core interfaces, data structures, and contracts for the RuleGo rule engine framework.
Package types defines the core interfaces, data structures, and contracts for the RuleGo rule engine framework.
types/endpoint
Package endpoint provides the core definitions and interfaces for endpoints in the RuleGo framework.
Package endpoint provides the core definitions and interfaces for endpoints in the RuleGo framework.
builtin
aspect
Package aspect provides built-in aspect-oriented programming (AOP) functionality for the RuleGo rule engine.
Package aspect provides built-in aspect-oriented programming (AOP) functionality for the RuleGo rule engine.
funcs
Package funcs provides built-in function implementations for the RuleGo rule engine.
Package funcs provides built-in function implementations for the RuleGo rule engine.
processor
Package processor provides built-in processor implementations for the RuleGo endpoint system.
Package processor provides built-in processor implementations for the RuleGo endpoint system.
components
action
Package action provides action node components for the RuleGo rule engine.
Package action provides action node components for the RuleGo rule engine.
base
Package base provides foundational components and utilities for the RuleGo rule engine.
Package base provides foundational components and utilities for the RuleGo rule engine.
external
Package external provides components for interacting with external systems and services in the RuleGo rule engine.
Package external provides components for interacting with external systems and services in the RuleGo rule engine.
filter
Package filter provides filter node components for the RuleGo rule engine.
Package filter provides filter node components for the RuleGo rule engine.
flow
Package flow provides components for managing sub-rule chains and component references in the RuleGo rule engine.
Package flow provides components for managing sub-rule chains and component references in the RuleGo rule engine.
transform
Package transform provides transformation node components for the RuleGo rule engine.
Package transform provides transformation node components for the RuleGo rule engine.
Package endpoint provides input endpoint components for the RuleGo rule engine.
Package endpoint provides input endpoint components for the RuleGo rule engine.
impl
Package impl provides the core implementation of the endpoint module.
Package impl provides the core implementation of the endpoint module.
mqtt
Package mqtt provides an MQTT endpoint implementation for the RuleGo framework.
Package mqtt provides an MQTT endpoint implementation for the RuleGo framework.
net
Package net provides a network endpoint implementation for the RuleGo framework.
Package net provides a network endpoint implementation for the RuleGo framework.
rest
Package rest provides an HTTP/REST endpoint implementation for the RuleGo framework.
Package rest provides an HTTP/REST endpoint implementation for the RuleGo framework.
schedule
Package schedule provides a scheduled task endpoint implementation for the RuleGo framework.
Package schedule provides a scheduled task endpoint implementation for the RuleGo framework.
websocket
Package websocket provides a WebSocket endpoint implementation for the RuleGo framework.
Package websocket provides a WebSocket endpoint implementation for the RuleGo framework.
Package engine provides the core functionality for the RuleGo rule engine.
Package engine provides the core functionality for the RuleGo rule engine.
examples
db_client command
delay_node command
functions_node command
hot_loading command
http_endpoint command
js_transform command
mqtt_client command
mqtt_endpoint_example/client command
Package main demonstrates how to create an MQTT client that sends binary and JSON data to an MQTT endpoint server.
Package main demonstrates how to create an MQTT client that sends binary and JSON data to an MQTT endpoint server.
mqtt_endpoint_example/server command
Package main demonstrates how to create an MQTT endpoint server that processes binary and JSON data using JavaScript transform node.
Package main demonstrates how to create an MQTT endpoint server that processes binary and JSON data using JavaScript transform node.
msg_type_switch command
net_endpoint_example/client command
Package main demonstrates how to create a NET client that sends binary data to a NET endpoint server.
Package main demonstrates how to create a NET client that sends binary data to a NET endpoint server.
net_endpoint_example/server command
Package main demonstrates how to create a NET endpoint server that processes binary and JSON data using JavaScript transform node.
Package main demonstrates how to create a NET endpoint server that processes binary and JSON data using JavaScript transform node.
net_node command
node_config command
plugin command
router command
ssh_node command
ui_api command
web_api command
Package node_pool provides shared node resource management for efficient connection reuse across different rule chains and components.
Package node_pool provides shared node resource management for efficient connection reuse across different rule chains and components.
utils
aes
Package aes provides encryption and decryption functions using the AES algorithm.
Package aes provides encryption and decryption functions using the AES algorithm.
dsl
el
fs
Package fs provides file system related utilities for the RuleGo project.
Package fs provides file system related utilities for the RuleGo project.
js
Package js provides JavaScript execution capabilities for the RuleGo rule engine.
Package js provides JavaScript execution capabilities for the RuleGo rule engine.
json
Package json provides utility functions for JSON marshaling, unmarshaling, and formatting.
Package json provides utility functions for JSON marshaling, unmarshaling, and formatting.
lca
maps
Package maps provides utility functions for working with maps and structs.
Package maps provides utility functions for working with maps and structs.
mqtt
Package mqtt provides MQTT client functionality for the RuleGo rule engine.
Package mqtt provides MQTT client functionality for the RuleGo rule engine.
pool
Package pool provides high-performance worker pool implementations for concurrent task execution.
Package pool provides high-performance worker pool implementations for concurrent task execution.
reflect
Package reflect provides utility functions for reflection-based operations.
Package reflect provides utility functions for reflection-based operations.
runtime
Package runtime provides utilities for runtime-related operations.
Package runtime provides utilities for runtime-related operations.
str
Package str provides utility functions for string manipulation and processing.
Package str provides utility functions for string manipulation and processing.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL