Solon Flow:轻量级流程编排引擎,让业务逻辑更优雅
在当今快速迭代的软件开发环境中,如何高效地管理和执行业务流程成为了开发者面临的重要挑战。Solon Flow作为Solon生态中的流程编排引擎,以其轻量级、高灵活性和强大的表达能力,为开发者提供了一种全新的解决方案。
为什么选择Solon Flow?
Solon Flow是一款基于YAML/JSON配置的流程编排引擎,它完美融合了"配置即代码"的理念,具有以下核心优势:
- 极简配置:采用YAML/JSON格式,配置简洁直观,支持自动推断和简化模式
- 多场景支持:无缝支持业务规则编排、计算任务编排、审批流程等多种场景
- 强大脚本能力:内置完整Java语法支持,可与多种脚本引擎集成
- 事件驱动架构:基于DamiBus实现的事件总线,实现组件间解耦
- 双模式引擎:同时支持无状态和有状态流程,满足不同业务需求
快速入门体验
让我们通过一个简单的Hello World示例,感受Solon Flow的魅力:
1. 添加依赖
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-flow</artifactId>
</dependency>
2. 配置流程(demo1.chain.yml)
id: "c1"
layout:
- { id: "n1", type: "start", link: "n2"}
- { id: "n2", type: "activity", link: "n3", task: "System.out.println(\"Hello Solon Flow!\");"}
- { id: "n3", type: "end"}
3. 执行流程
@Component
public class DemoApp implements LifecycleBean {
@Inject
private FlowEngine flowEngine;
@Override
public void start() {
flowEngine.eval("c1"); // 输出:Hello Solon Flow!
}
}
核心功能解析
1. 灵活的流程配置
Solon Flow支持完整的流程图概念,包括链(Chain)、节点(Node)和连接(Link)。节点类型丰富:
- 开始节点(start):流程入口,每个链必须有且只有一个
- 活动节点(activity):执行具体任务,支持条件和脚本
- 网关节点(inclusive/exclusive/parallel):控制流程分支
- 结束节点(end):流程终点
# 审批流程示例
id: "leave-approval"
title: "请假审批"
layout:
- { id: "start", type: "start", title: "发起申请", meta: {form: "leave"}, link: "tl-review"}
- { id: "tl-review", type: "activity", title: "主管审批", meta: {role: "team-leader"}, link: "gate-3days"}
- { id: "gate-3days", type: "exclusive", link: [
{nextId: "dm-review", title: "超过3天", condition: "days > 3"},
{nextId: "end", title: "3天内"}
]}
- { id: "dm-review", type: "activity", title: "部门经理审批", meta: {role: "dept-manager"}, link: "end"}
- { id: "end", type: "end"}
2. 强大的脚本与表达式
Solon Flow默认支持完整的Java语法脚本,同时可通过定制驱动器集成Aviator、Beetl等脚本引擎:
# 业务规则示例
id: "risk-control"
layout:
- { type: "start"}
- { when: "score < 60", task: "context.result = '高风险'; actions.add('人工审核')"}
- { when: "score >= 60 && score < 80", task: "context.result = '中风险'"}
- { when: "score >= 80", task: "context.result = '低风险'; actions.add('自动通过')"}
- { type: "end"}
3. 组件化开发模式
通过实现TaskComponent接口,可以将业务逻辑封装为可复用的组件:
@Component("scoreCalc")
public class ScoreCalculator implements TaskComponent {
@Override
public void run(FlowContext context, Node node) {
Order order = context.get("order");
// 计算逻辑...
order.setScore(calculateScore(order));
}
private int calculateScore(Order order) {
// 评分算法实现
}
}
在流程中引用组件:
id: "order-process"
layout:
- { type: "start"}
- { task: "@scoreCalc"} # 使用评分组件
- { task: "@riskCheck"} # 使用风控组件
- { type: "end"}
4. 事件驱动架构
Solon Flow内置基于DamiBus的事件总线,实现组件间解耦:
# 事件发送示例
id: "event-demo"
layout:
- task: |
// 发送事件
context.eventBus().send("order.created", order);
- task: |
// 发送并等待响应
String result = context.<String,String>eventBus()
.sendAndRequest("risk.check", order);
事件监听处理:
public class RiskListener {
@Inject
private FlowEngine engine;
public void init() {
FlowContext context = new FlowContext();
context.<String,String>eventBus().listen("risk.check", event -> {
Order order = event.getContent();
event.reply(checkRisk(order));
});
engine.eval("event-demo", context);
}
}
企业级特性
1. 有状态流程支持
对于审批类场景,Solon Flow提供了StatefulFlowEngine:
// 配置有状态引擎
@Bean
public StatefulFlowEngine flowEngine() {
return StatefulFlowEngine.newInstance(
StatefulSimpleFlowDriver.builder()
.stateController(new RoleBasedStateController())
.stateRepository(new RedisStateRepository())
.build()
);
}
// 审批处理示例
public void approve(String instanceId, String nodeId, String userId) {
FlowContext context = new FlowContext(instanceId).put("user", userId);
flowEngine.postActivityState(context, nodeId, StateType.COMPLETED);
}
2. 拦截器机制
通过ChainInterceptor可以实现流程监控、日志记录等横切关注点:
@Component
public class MetricsInterceptor implements ChainInterceptor {
@Override
public void doIntercept(ChainInvocation inv) throws Throwable {
long start = System.currentTimeMillis();
try {
inv.invoke();
} finally {
long cost = System.currentTimeMillis() - start;
Metrics.record(inv.getChain().id(), cost);
}
}
}
3. 多环境支持
Solon Flow可以轻松集成到各种环境:
// Spring集成示例
@Configuration
public class SpringConfig {
@Bean
public FlowEngine flowEngine(ApplicationContext ctx) {
FlowEngine engine = FlowEngine.newInstance();
engine.register(new SimpleFlowDriver(new SpringAdapter(ctx)));
engine.load("classpath:flows/**/*.yml");
return engine;
}
}
// 原生Java环境
public class NativeApp {
public static void main(String[] args) {
FlowEngine engine = FlowEngine.newInstance();
engine.load("file:conf/flows/*.json");
engine.eval("main-flow");
}
}
典型应用场景
1. 业务规则引擎
替代Drools等规则引擎,配置更简单:
id: "discount-rule"
layout:
- { type: "start"}
- { when: "user.level == 'VIP' && cart.total > 1000", task: "cart.discount = 0.2"}
- { when: "user.level == 'VIP'", task: "cart.discount = 0.1"}
- { when: "cart.total > 500", task: "cart.discount = 0.05"}
- { type: "end"}
2. 计算任务编排
类似LiteFlow的编排能力,但风格很不同:
id: "data-pipeline"
layout:
- { type: "start"}
- { task: "@dataExtract"}
- { task: "@dataTransform"}
- { task: "@dataLoad"}
- { type: "end"}
3. 审批流程管理
类似 Flowable 的效果。支持会签、或签等审批模式:
id: "contract-approval"
layout:
- { type: "start", title: "发起合同", link: "finance"}
- { id: "finance", type: "parallel", title: "财务会签", link: ["f1", "f2"]}
- { id: "f1", type: "activity", title: "财务经理审批", meta: {role: "finance-mgr"}, link: "join"}
- { id: "f2", type: "activity", title: "财务总监审批", meta: {role: "finance-dir"}, link: "join"}
- { id: "join", type: "parallel", link: "legal"}
- { id: "legal", type: "activity", title: "法务审核", meta: {role: "legal"}, link: "end"}
- { type: "end"}
为什么Solon Flow值得尝试?
- 学习成本低:基于熟悉的YAML/JSON配置,半小时即可上手
- 无缝集成:轻松融入Spring、Solon等各种Java生态
- 性能优异:轻量级设计,单线程每秒可执行上万次简单流程
- 灵活扩展:支持驱动器定制,满足各种特殊需求
- 生产验证:已在多家企业生产环境稳定运行
Solon Flow重新定义了流程编排的方式,让开发者能够以更声明式的方式表达业务逻辑,大幅提升开发效率的同时,保证了系统的可维护性和扩展性。无论是简单的业务规则,还是复杂的审批流程,Solon Flow都能优雅应对。
Solon Flow:轻量级流程编排引擎,让业务逻辑更优雅的更多相关文章
- 流程编排、如此简单-通用流程编排组件JDEasyFlow介绍
作者:李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排.工作流.审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-ea ...
- 开源组件编排引擎LiteFlow发布里程碑版本2.5.0
介绍 LiteFlow作为一款轻量级组件编排框架,自开源来,获得了挺多人的关注.社区群也扩展到了接近200人. 早期版本因为疏忽打理,有一些BUG,迭代也不及时.距离上一个稳定版本2.3.3,已经有超 ...
- 基于netty http协议栈的轻量级流程控制组件的实现
今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...
- netflix:Conductor微服务编排引擎
项目地址: https://github.com/Netflix/conductor Conductor 是 Netflix 受需要运行全球流媒体业务流程的启发,构建的基于云的微服务编排引擎. Con ...
- jsplumbWithVue实现流程编排
最近业务需求,通过拖拽,实现流程编排,包括编排元素中的各种属性,刚开始拿到这个需求,一头雾水啊,找度娘渡了好久,FQ翻了很久,各种博客CSDN搜索,最终技术选型还是定在了jsplumb,这要感谢@萌级 ...
- Karmada 多云容器编排引擎支持多调度组,助力成本优化
摘要:Karmada 社区也在持续关注云成本的管理,在最近发布的 v1.5 版本中,支持用户在分发策略 PropagationPolicy/ClusterPropagationPolicy 中设置多个 ...
- FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码
FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...
- IT的灵魂是流程,流程的灵魂是业务,业务的灵魂是战略
IT的灵魂是流程,流程的灵魂是业务,业务的灵魂是战略.高效的IT平台不在于IT技术,而在于好的管理模式与流程设计 从以组织为核心转向以流程为核心 流程管理核心是从流程角度出发,关注流程是否增值,籍此建 ...
- Git flow 的流程
Git flow 的流程与参考 Git flow 出自 A successful Git branching model,这里使用了一个前端项目配合本文稿实施了 git flow 并记录流程作出示 ...
- 对比剖析Swarm Kubernetes Marathon编排引擎
Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目.Docker原生集群(S ...
随机推荐
- 『Plotly实战指南』--散点图绘制进阶篇
在数据分析的世界里,散点图是一种极为重要的可视化工具. 它能够直观地展示两个或多个变量之间的关系,帮助我们快速发现数据中的模式.趋势和异常点. 无论是探索变量之间的相关性,还是寻找数据中的潜在规律,散 ...
- shell处理字符串
概念 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号. 单引号声明字符串 单引号里的任何字符都会原样输出, ...
- kettle介绍-Step之Return steps metrics
Return steps metrics转换步骤信息统计介绍 转换步骤信息统计步骤可以用于统计当前转换中的其它步骤信息,包括步骤执行后的输入行数.输入行数.读入行数.更新行数等.此步骤可以直接拖入转换 ...
- ORA-24247:网络访问被访问控制列表(ACL)拒绝器
我在oracle 存储过程中发送http请求, 报错如下: ORA-29273:HTTP请求失败 ORA-06512:在"SYS.UTL HTTP",line 1527 ORA-2 ...
- 【记录】日常|shandianchengzi的三周年创作纪念日
机缘 接触 CSDN 之前,我已经倒腾过 hexo 搭建 github 博客.本地博客.图床: 接触 CSDN 之后,我还倒腾过纸质笔记.gitee 博客.博客园.知乎.b站.Notion.腾 ...
- 【HUST】网安|计算机网络|计算机网络自顶向下方法(原书第7版)第三章部分习题答案
参考:英文版的原答案. 答案放gitee了,自取. 3-P18. 3.4.4 节我们学习的一般性 SR 协议中,只要报文可用(如果报文在窗口中) ,发送方就会不等待确认而传输报文.假设现在我们要求一个 ...
- TVM:设计与架构
本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员.页面组织如下: 示例编译流程概述了 TVM 将模型的高层描述转换为可部署模块所采取的步骤.要开始使用,请先阅读本节. 逻辑架构组件部分描 ...
- 用python标准库smtplib来发QQ邮件及Django中发送邮件
1.QQ邮箱设置 点击QQ邮箱账号,进入后,开启smtp服务许可: 点击"生产授权码",在手机上发送相应的短信,得到授权码.[注意授权码之间没有空格] 2.典型代码块 impo ...
- C语言函数指针解析
C语言函数指针解析 一.函数指针的本质 函数指针是存储函数内存地址的变量,它允许程序在运行时动态调用不同的函数.与数据指针不同,函数指针指向的是可执行代码段. /* 典型声明方式 */ int (*f ...
- React-Native开发鸿蒙NEXT-权限处理
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...