LiteFlow LiteFlow
首页
  • v2.16.1 (当前版本)
  • What's New

    • What' s New In LiteFlow v2.16.1?
    • What' s New In LiteFlow v2.16.0?
  • 历史版本

    • v2.15.X
    • v2.13.X
    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
AI Agent
AI Skill
IDEA 插件
  • 答疑解惑

    • 常见问题
    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念?
  • 项目与社区

    • 项目介绍
    • 项目成员
    • 更新记录
    • 参与开发
    • 加入群聊
    • 谁在使用
赞助
GitHub (opens new window)

广告采用随机轮播方式显示 ❤️成为赞助商
首页
  • v2.16.1 (当前版本)
  • What's New

    • What' s New In LiteFlow v2.16.1?
    • What' s New In LiteFlow v2.16.0?
  • 历史版本

    • v2.15.X
    • v2.13.X
    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
AI Agent
AI Skill
IDEA 插件
  • 答疑解惑

    • 常见问题
    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念?
  • 项目与社区

    • 项目介绍
    • 项目成员
    • 更新记录
    • 参与开发
    • 加入群聊
    • 谁在使用
赞助
GitHub (opens new window)
  • 🍤LiteFlow简介
  • 🍓项目特性
  • 🧁环境支持

    • ☕️JDK支持度
    • 🌿Springboot支持度
    • 🌱Spring的支持度
  • 🍟快速开始(Hello world)

    • 🍄说明
    • 🌿Springboot场景安装运行
    • 🌱Spring场景安装运行
    • 🍩Solon场景安装运行
    • 🌵其他场景安装运行
  • 🍢配置项

    • 🍄说明
    • 🌿Springboot下的配置项
    • 🌱Spring下的配置项
    • 🍩Solon下的配置项
    • 🌵其他场景代码设置配置项
  • 🔗组件

    • 🛍继承式组件

      • 📎普通组件
      • ✂️选择组件
      • ⛓布尔组件
      • 🧬次数循环组件
      • ⌛️迭代循环组件
      • 🏄LiteflowComponent
      • 🛀组件内方法覆盖和调用
    • 🎁声明式组件

      • 🥭什么叫声明式组件
      • 🧅类级别式声明
      • 🥥方法级别式声明
  • 🧩EL规则

    • 🍄说明
    • 🌴串行编排
    • 🎋并行编排
    • 🌾选择编排
    • 🌵条件编排
    • 🌳循环编排
    • 🥦异步循环模式
    • 🎃捕获异常表达式
    • 🍄与或非表达式
    • 🍁使用子流程
    • 🍂使用子变量
    • 💐复杂编排例子
    • 🍒前置和后置编排
    • 🍉组件参数语法

      • 说明
      • tag语法
      • data语法
      • bind语法
    • 🫐重试语法
    • ⏱️超时控制语法
    • 🥯链路继承
    • 🔆验证规则
    • 🌰关于注释
    • 🌻关于分号
    • 🐚组件名包装
  • 🌮上下文

    • 🍄说明
    • 🌯数据上下文的定义和使用
    • 🪶用初始化好的上下文传入
    • 🥨给上下文设置别名
    • 🥙上下文参数注入
    • 🪴用表达式获取上下文参数
  • 🛩执行器

    • 🍄说明
    • 🎡执行方法
    • 🎢流程入参
    • 🎈LiteflowResponse对象
    • 🪃直接执行EL规则
  • 🍋脚本组件

    • 🌭脚本语言介绍
    • 🍫脚本语言种类

      • ☕️Java脚本引擎
      • 🥏Groovy脚本引擎
      • 🧀Javascript脚本引擎
      • 🥞QLExpress脚本引擎
      • 🍧Python脚本引擎
      • 🍝Lua脚本引擎
      • 🥐Aviator脚本引擎
      • 🥠Kotlin脚本引擎
    • 🍣脚本与Java进行交互
    • 🍱多脚本语言混合共存
    • 🌯文件脚本的定义
    • 🍘动态刷新脚本
    • 🍦验证脚本
    • 🗑卸载脚本
  • 🗂规则配置源

    • 📕本地规则文件配置
    • 📘SQL数据库配置源(旧)
    • 📗ZK规则文件配置源(旧)
    • 📋Nacos配置源(旧)
    • 🗄Etcd配置源(旧)
    • 📜Apollo配置源(旧)
    • 📑Redis配置源(旧)

      • 配置说明
      • 轮询模式配置
      • 订阅模式配置
    • 📙自定义配置源
  • 🏦Rule-DB模式

    • 🏦Rule-DB是什么
      • 和旧版规则配置源插件的区别
      • 旧插件还能用吗
      • 它不管什么
      • 一致性语义(务必先读)
      • 从哪开始看
    • 🐬快速开始(SQL)
    • 🐘快速开始(PostgreSQL)
    • 🍃快速开始(MongoDB)
    • 📕快速开始(Redis)
    • 📗快速开始(ZooKeeper)
    • 🗄快速开始(Etcd)
    • 📋快速开始(Nacos)
    • 🍢配置项参考
    • 🗃存储结构参考
    • 📤发布API与写入规范
    • ⚖️一致性与收敛模型
    • 🪁内存与性能
    • 🔭可观测性与降级
    • 🚧限制与迁移
  • 🍼元数据管理

    • ⛰元数据操作器
    • 🍖平滑热刷新
    • 🍮启动不检查规则
    • 🥨启动不检查脚本
  • 🌌异步中的线程池

    • 💧说明
    • 🐋FlowExecutor层面的线程池
    • 🐠组件异步层面的线程池
    • 🪶虚拟线程
  • 🎲动态构造

    • 🍄说明
    • 🥜构造Node
    • 🌰构造EL
    • 🍞构造Chain
  • 🧮决策路由

    • 🏖概念以及介绍
    • 🍽决策路由用法
  • 😸生命周期

    • 🐮启动时生命周期
    • 🐳执行时生命周期
  • 🎨高级特性

    • 🍌本地规则文件监听
    • 🥠组件降级
    • 🍑组件别名
    • 🥝组件事件回调
    • 🐋组件回滚
    • 🥑隐式子流程
    • 🫐活跃规则保活策略
    • 🍕私有投递
    • 🍪组件切面
    • 🍡步骤信息
    • 🧊异常
    • 🧇打印信息详解
    • 🧁自定义请求Id
    • 🫕快速解析模式
    • 🌭不同格式规则加载
    • 🍿自定义组件执行器
    • 🍥简单监控
    • 🧉XML的DTD
  • 📈指标监控

    • 📈指标监控概述
    • 🚀快速接入
    • 📋指标目录
    • 🔌Actuator端点说明
    • 📐分位与直方图
    • 🔍常用PromQL与告警
    • ⚡性能影响与基数控制
  • ⛱测试用例以及示例

    • 🪁测试用例
    • 🪀DEMO案例
  • 🪂性能表现
  • v2.16.X文档
  • 🏦Rule-DB模式
铂赛东
2026-07-25
目录

🏦Rule-DB是什么

版本支持:v2.16.1+

Rule-DB是2.16.1推出的全新规则存储模式。在这个模式下,存储才是规则和脚本的权威源,JVM里常驻的只有规则清单、影子对象和状态索引,而EL正文、脚本源码和编译产物都放进有界缓存,按热度淘汰。

目前提供七个后端:

后端模块 存储 变更感知方式
liteflow-rule-db-sql MySQL / MariaDB seq 轮询(默认 3s)+ 周期对账
liteflow-rule-db-postgresql PostgreSQL seq 轮询 + 周期对账
liteflow-rule-db-mongodb MongoDB(副本集/分片) seq 轮询 + 周期对账
liteflow-rule-db-redis Redis seq 轮询 + 周期对账
liteflow-rule-db-zk ZooKeeper watch 实时推送 + 周期对账
liteflow-rule-db-etcd Etcd watch 实时推送 + 周期对账
liteflow-rule-db-nacos Nacos(Server 2.x+) Listener 推送 + 周期对账

# 和旧版规则配置源插件的区别

旧版的6个liteflow-rule-*插件(sql、zk、nacos、etcd、apollo、redis),本质上都是同一个流程:

启动 → 从存储全量读出所有规则和脚本 → 拼成一个大XML → 走同一条解析路径加载进JVM

存储在这里只是个"启动数据源",一旦启动完成,规则就活在各个节点自己的JVM里了。这么做有四个问题:

痛点 表现
多节点没有一致性保证 规则活在各节点的JVM里,刷新靠各插件自己的轮询或通知机制,时间窗内各节点的版本可能不一样。通知一旦丢了,也没有兜底的对账,最终收敛没法保证。
规则和脚本全量常驻JVM堆 即使开了parseOneOnFirstExec,EL文本和脚本源码还是全量待在FlowBus的map里。chainCacheEnabled只淘汰编译产物,不淘汰文本。规则一多,堆内存就上去了。
接入成本高 拿旧SQL插件来说,你得先建好表,再把每一个表名和字段名逐条映射进rule-source-ext-data-map,chainTableName、chainNameField、elDataField、scriptTypeField,二十来项,还得另外配轮询开关和周期。
写入全靠自己 没有官方的写入API,改规则就是往库里INSERT或UPDATE,版本号、指纹、刷新时机都得使用方自己拿捏。

Rule-DB把这几件事一并解决了:

  1. 存储是权威源,JVM只是缓存。发布和删除都走发布API,原子完成更新内容、版本号加一、写变更日志这三件事。所有节点靠变更通知和周期对账两条腿收敛,即使通知丢了,一个对账周期内也必然收敛。
  2. 规则正文和编译产物不再全量常驻。JVM仍然会为每条清单记录维护影子Chain和Node、版本戳以及状态索引,这部分随规则总数线性增长;而EL文本、脚本源码和编译产物放进Caffeine有界缓存,按访问热度淘汰,淘汰之后退回影子状态,下次执行再懒加载。
  3. 配置基本上就一行。表结构和字段名都由模块固定,没有字段映射可配。对单数据源的Spring Boot应用来说,Rule-DB要的配置就是spring.application.name,而这一行你本来就有。连接直接复用容器里的DataSource、RedissonClient、MongoClient、ConfigService,按类型自动查找,只有存在多个同类bean时才需要指名(zk的CuratorFramework和etcd的jetcd Client要显式配bean名)。
  4. 建表也可以免了。SQL和PostgreSQL开auto-init-table=true,启动时就把四张表建齐;Redis的键结构在首次发布时自动创建;MongoDB的Collection和索引、zk和etcd的路径、Nacos的Catalog,都由Publisher初始化。整个上手过程里没有"先去数据库跑一段DDL"这一步。当然生产环境还是建议由DBA建表,好让执行账号保持只读。
  5. 改规则不用碰数据库。增删改都走统一的RulePublisher,也就是publishChain、publishScript、removeChain、removeScript这几个方法。版本自增、md5重算、变更日志、发布顺序锁和乐观锁(expectedVersion),框架会在一个事务、一段Lua或者一次CAS里做完,发布之后各节点秒级收敛。管理后台只依赖一个jar,不需要拉起FlowExecutor。

一句话划清边界:旧的6个插件是二十来项字段映射加手写SQL改规则,启动时一次性灌库,之后各节点各跑各的;Rule-DB是一行配置加Publisher发布,存储永远是权威,JVM只缓存热规则,所有节点最终一致。

什么是影子状态

所谓影子状态,就是一个chain只注册了chainId,没有EL,也没编译;一个脚本Node只登记了元数据(type、language、name),没有源码,也没编译。这么做是为了让索引常驻、内容按需加载,执行到它的时候才回源拉取并编译。

# 旧插件还能用吗

能用,而且会继续维护,已有项目不需要为了升级2.16.1去改造。

但如果是新项目,我们推荐用Rule-DB。两者的运行模型和配置完全独立,不能混用:

  • liteflow.rule-source和liteflow.rule-db.*互斥,同时配置会启动报错。
  • 七个Rule-DB插件同一时刻classpath里只能有一个,启动时检测到多个会直接报错。
  • 迁移到同一个后端时,旧的规则插件也要移除。

Apollo目前只有旧插件,Rule-DB的Apollo后端留作后续,core里的RuleRepository SPI已经定义好了。

# 它不管什么

Rule-DB只纳管EL和脚本,Java组件还是随应用代码一起部署。

Publisher只校验请求字段和存储约束,发布时不会编译EL。所以如果你引用了不存在的Java组件、子chain或脚本节点,是在执行节点首次编译这条chain的时候才会失败。

# 一致性语义(务必先读)

Rule-DB提供的是最终一致性,收敛窗口在秒级,它不是原子切换,也不是线性一致:

  • 你发布一个新版本之后,在收敛窗口内,不同节点可能短暂地跑着不同版本。
  • 正在执行中的请求会持有旧的条件树引用跑完,新的执行拿到新版,这和现有的copy-on-write语义一致。也就是说,不会所有节点在同一个逻辑时刻切换。
  • 对绝大多数业务编排场景来说这已经够了。但如果你的业务要求全集群在同一时刻切版,那么当前版本的Rule-DB满足不了,请不要用。

详见一致性与收敛模型。

# 从哪开始看

  • 先跑通一个最小的例子:快速开始(SQL)
  • 其他后端:PostgreSQL、MongoDB、Redis、ZooKeeper、Etcd、Nacos
  • 查配置项:配置项参考
  • 写管理后台:发布API与写入规范
  • 上生产前:一致性与收敛模型、内存与性能、可观测性与降级、限制与迁移
帮助我们改善此文档 (opens new window)
📙自定义配置源
🐬快速开始(SQL)

← 📙自定义配置源 🐬快速开始(SQL)→

Theme by Vdoing | Copyright © 2020-2026 铂赛东 | MIT License
沪ICP备18012955号-2