面试自研流程引擎




-
提供三类条件引擎:SpEL 表达式、Groovy 动态脚本、外部接口条件,支持复杂分支和优先级路由。
-
解决问题:节点在一对多的的时候,我们要进行复杂分支和优先级路由,这时我们可以在配置页面通过不同语言的脚本解决这个问题。
-
一、三类条件引擎的含义
1. SpEL 表达式(Spring Expression Language)
-
是什么:Spring 框架提供的轻量级表达式语言,可以在运行时求值字符串形式的表达式(例如
#order.amount > 1000 && #user.level == 'VIP')。 -
特点:
-
与 Java 对象无缝集成:直接读取对象的属性、调用方法、访问集合。
-
性能较好:解析后的表达式会被缓存,适合高频、低延迟的场景。
-
安全可控:可以通过
SimpleEvaluationContext限制功能(比如禁止执行 Java 类静态方法),避免注入攻击。
-
-
典型用途:配置化简单规则(如优惠门槛、风控条件),无需重启服务即可修改表达式。
2. Groovy 动态脚本
-
是什么:一种运行在 JVM 上的动态语言,支持完整的脚本化编程(可以写条件、循环、甚至调用外部服务)。
-
特点:
-
能力远强于 SpEL:能实现复杂计算、临时数据处理、工具类调用,甚至可以引入第三方库。
-
热加载:脚本字符串可动态编译、执行、卸载,非常适合频繁变更的业务逻辑。
-
性能弱于 SpEL:每次执行需编译(可缓存
Script对象优化),但仍比原生 Java 稍慢。
-
-
典型用途:复杂但变更频繁的规则(例如动态计算运费、积分兑换算法),或需要业务人员通过后台界面编辑脚本的场景。
3. 外部接口条件
-
是什么:把条件判断的逻辑外移到独立的微服务或 HTTP API 中,规则引擎只负责调用接口并根据返回结果(true/false 或具体值)进行路由。
-
特点:
-
解耦最彻底:规则逻辑独立部署,可以跨语言、跨团队维护。
-
支持异步/大数据量:接口内部可以查数据库、跑模型、甚至人工审核。
-
有网络开销:需考虑超时、重试、熔断,不适合极高吞吐的实时判断。
-
-
典型用途:需要复用已有业务接口(如用户风控评分、黑名单检查),或规则依赖机器学习模型、外部数据源。
二、如何支持复杂分支和优先级路由
面试官更关心的往往是组合设计,而不是单一概念。
-
复杂分支:
一个决策节点往往有多个出口(例如条件A → 节点1,条件B → 节点2,else → 节点3)。三类引擎都能返回布尔值或枚举值,配合规则链(Rule Chain)或决策表(Decision Table)即可实现多分支。 -
优先级路由:
规则按优先级排序,从高到低依次匹配。命中某条规则后,可继续或终止。-
SpEL / Groovy 适合执行优先级冲突的快速匹配。
-
外部接口可以作为高优先级特殊规则(例如VIP用户先走外部特权校验),或者作为最后兜底规则(例如查询风控中心)。
-
组合使用示例:
规则引擎入口: 1. 优先调用外部接口(检查是否黑名单) → 命中则拒绝 2. 再匹配 Groovy 脚本规则(例如“最近7天退款次数>3”) → 命中则转人工审核 3. 最后用 SpEL 表达式处理普通业务规则(金额满减、会员等级折扣)
-
-
-

浙公网安备 33010602011771号