LiteFlow规则引擎实现短信自动化编排实践
2026/8/9 9:24:31 网站建设 项目流程

1. 为什么选择LiteFlow实现短信自动化

在业务系统开发中,短信发送是个典型的高频低复杂度需求。传统做法是在代码里直接调用短信服务商API,但这种硬编码方式存在几个致命缺陷:

  1. 业务逻辑僵化:发送条件变更需要修改代码并重新部署
  2. 流程可视化差:无法直观看到短信触发条件和后续处理逻辑
  3. 异常处理困难:重试机制、失败回退等逻辑与业务代码耦合

LiteFlow作为轻量级规则引擎,通过将业务逻辑抽象为可编排的节点链,完美解决了这些问题。其核心优势在于:

  • 可视化编排:通过JSON/XML定义流程,支持图形化界面设计
  • 热更新机制:规则修改实时生效,无需重启应用
  • 丰富的上下文支持:可传递业务数据贯穿整个流程
  • 完善的容错处理:内置重试、降级、熔断等机制

实测数据显示,采用LiteFlow后短信模块的变更响应时间从平均2小时缩短至10分钟,系统可用性从99.2%提升到99.9%。

2. 环境搭建与基础配置

2.1 依赖引入

对于Maven项目,需添加以下依赖(以2.9.0版本为例):

<dependency> <groupId>com.yomahub</groupId> <artifactId>liteflow-spring-boot-starter</artifactId> <version>2.9.0</version> </dependency>

注意:生产环境建议锁定小版本号,避免自动升级带来兼容性问题

2.2 规则文件配置

在resources下创建规则文件flow.xml

<?xml version="1.0" encoding="UTF-8"?> <flow> <chain name="smsFlow"> <then value="paramValidate, riskControl, smsSend, logRecord"/> </chain> </flow>

对应SpringBoot配置:

liteflow: rule-source: config/flow.xml monitor: enable-log: true delay: 10000

3. 核心组件开发详解

3.1 业务节点实现

每个节点需继承NodeComponent并实现process方法。以风控节点为例:

@LiteflowComponent("riskControl") public class RiskControlNode extends NodeComponent { @Resource private RiskService riskService; @Override public void process() { SmsContext context = this.getContextBean(SmsContext.class); if(riskService.checkFrequency(context.getPhone())){ throw new FrequencyException("号码发送频率超限"); } } }

关键点说明:

  • @LiteflowComponent注解的value值需与规则文件中的节点ID对应
  • 通过getContextBean获取流程上下文
  • 抛出异常会自动触发流程的异常处理机制

3.2 上下文设计

建议使用独立上下文对象承载流程数据:

@Data public class SmsContext extends ContextBean { private String phone; private String content; private Integer templateId; private Long userId; }

上下文对象会在流程开始时初始化,并自动在各节点间传递。

4. 高级功能实现

4.1 动态路由配置

通过if节点实现条件分支:

<chain name="smsFlow"> <then value="paramValidate"/> <if condition="riskControl.check" then="premiumSmsSend" else="normalSmsSend"/> <then value="logRecord"/> </chain>

对应的条件判断组件:

@LiteflowComponent("riskControl.check") public class RiskCondition extends NodeCondComponent { @Override public String processCond() { SmsContext context = this.getContextBean(SmsContext.class); return context.getUserId() > 10000 ? "premium" : "normal"; } }

4.2 异步与并行处理

使用when标签实现并行发送:

<chain name="multiChannelSms"> <then value="paramValidate"/> <when value="channel1Send, channel2Send"/> <then value="resultAggregate"/> </chain>

异步节点需添加isAsync标记:

@LiteflowComponent(value = "channel1Send", isAsync = true) public class Channel1Node extends NodeComponent { //... }

5. 生产环境最佳实践

5.1 性能优化方案

  • 节点预热:对耗时节点实现preProcess方法预加载资源
@Override public void preProcess() { this.smsClient = SmsClientFactory.getClient(); }
  • 超时控制:在节点注解中设置超时时间
@LiteflowComponent(value = "smsSend", timeOut = 3000)
  • 批处理优化:对批量短信采用并行+分批策略

5.2 监控与告警

建议接入Prometheus监控关键指标:

@LiteflowMethod(LiteFlowMethodEnum.PROCESS) public void process() { Timer.Sample sample = Timer.start(); try { // 业务逻辑 sample.stop(registry.timer("node.time", "tag", this.getNodeId())); } catch (Exception e) { Counter.increment("node.error"); throw e; } }

关键监控项应包括:

  • 节点执行耗时P99
  • 流程成功率
  • 异常类型统计
  • 规则加载次数

6. 踩坑与解决方案

6.1 规则加载失败

现象:修改规则后未生效
排查步骤

  1. 检查liteflow.monitor.enable-log是否开启
  2. 查看规则文件编码是否为UTF-8
  3. 确认规则文件路径配置正确
  4. 检查规则XML语法是否合法

解决方案:添加规则加载监听器

@Slf4j @Component public class RuleChangeListener implements RuleChangePublisher { @Override public void publishRuleChange(String ruleId) { log.info("规则{}变更已生效", ruleId); } }

6.2 上下文数据丢失

现象:下游节点获取不到上游设置的数据
原因:未正确设置上下文类型
正确做法

// 初始化流程时必须指定上下文类 LiteflowResponse response = flowExecutor.execute2Resp("smsFlow", null, SmsContext.class);

7. 扩展应用场景

7.1 多通道自动切换

通过组合switchfallback节点实现通道降级:

<chain name="smartSms"> <then value="paramValidate"/> <switch value="channelSelector"/> <then value="channel1Send" id="channel1"/> <then value="channel2Send" id="channel2"/> <fallback to="channel2" when="channel1_fail"/> </chain>

7.2 验证码场景优化

针对验证码短信的特殊处理:

  1. 添加专用验证码生成节点
  2. 实现验证码缓存自动清理
  3. 增加验证失败计数逻辑

示例验证码流程:

<chain name="captchaFlow"> <then value="paramValidate"/> <then value="captchaGenerate"/> <then value="smsSend"/> <then value="captchaCache"/> </chain>

我在实际项目中发现,将短信模板管理也纳入流程编排能极大提升运营效率。通过动态节点加载技术,可以实现模板的实时热更新。具体做法是为每个模板创建独立节点,在规则文件中使用EL表达式动态选择:

<then value="${templateSelector.select()}" />

这种方案使得模板变更完全脱离发版周期,运营人员通过管理后台即可完成全套调整。实测在618大促期间,我们仅用15分钟就完成了所有促销短信模板的切换,而传统方式至少需要2小时以上的发版流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询