1. 为什么选择LiteFlow实现短信自动化
在业务系统开发中,短信发送是个典型的高频低复杂度需求。传统做法是在代码里直接调用短信服务商API,但这种硬编码方式存在几个致命缺陷:
- 业务逻辑僵化:发送条件变更需要修改代码并重新部署
- 流程可视化差:无法直观看到短信触发条件和后续处理逻辑
- 异常处理困难:重试机制、失败回退等逻辑与业务代码耦合
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: 100003. 核心组件开发详解
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 规则加载失败
现象:修改规则后未生效
排查步骤:
- 检查
liteflow.monitor.enable-log是否开启 - 查看规则文件编码是否为UTF-8
- 确认规则文件路径配置正确
- 检查规则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 多通道自动切换
通过组合switch和fallback节点实现通道降级:
<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 验证码场景优化
针对验证码短信的特殊处理:
- 添加专用验证码生成节点
- 实现验证码缓存自动清理
- 增加验证失败计数逻辑
示例验证码流程:
<chain name="captchaFlow"> <then value="paramValidate"/> <then value="captchaGenerate"/> <then value="smsSend"/> <then value="captchaCache"/> </chain>我在实际项目中发现,将短信模板管理也纳入流程编排能极大提升运营效率。通过动态节点加载技术,可以实现模板的实时热更新。具体做法是为每个模板创建独立节点,在规则文件中使用EL表达式动态选择:
<then value="${templateSelector.select()}" />这种方案使得模板变更完全脱离发版周期,运营人员通过管理后台即可完成全套调整。实测在618大促期间,我们仅用15分钟就完成了所有促销短信模板的切换,而传统方式至少需要2小时以上的发版流程。