Files
tms-erp-base-tool/blade-starter-literule/README.md
T
2026-07-07 18:01:21 +08:00

350 lines
10 KiB
Markdown

# Blade LiteRule 规则引擎
BladeX框架的轻量级规则引擎,提供简单易用的规则执行和编排能力。
## 特性
- 支持顺序规则、分支规则和并行规则三种执行模式
- 提供流式API用于构建规则链
- 支持同步和异步执行
- 完整的生命周期管理和监控
- 基于Spring管理规则实例
- 线程安全的上下文管理
- 规则链缓存和预加载
- 循环依赖检测
## 快速开始
### 1. 添加依赖
```xml
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-literule</artifactId>
<version>${blade.tool.version}</version>
</dependency>
```
### 2. 定义规则上下文
```java
import org.springblade.core.literule.core.RuleContextComponent;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderContext extends RuleContextComponent {
private String orderId;
private BigDecimal amount;
private String paymentType;
private String status;
private Address shippingAddress;
// 其他业务字段...
}
```
### 3. 实现普通规则
```java
import org.springblade.core.literule.annotation.LiteRuleComponent;
@Slf4j
@LiteRuleComponent("orderValidateRule")
public class OrderValidateRule extends RuleComponent {
@Override
protected void process() throws Exception {
OrderContext context = getContextBean(OrderContext.class);
// 执行业务逻辑
if (StringUtils.isEmpty(context.getOrderId())) {
context.addError("订单ID不能为空");
return;
}
if (context.getAmount() == null || context.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
context.addError("订单金额无效");
return;
}
log.info("[规则1] 订单校验通过:{}", context.getOrderId());
}
}
```
### 4. 实现分支规则
```java
import org.springblade.core.literule.annotation.LiteRuleComponent;
@Slf4j
@LiteRuleComponent("paymentRouteRule")
public class PaymentRouteRule extends SwitchRuleComponent {
@Override
protected List<String> process() throws Exception {
OrderContext context = getContextBean(OrderContext.class);
String paymentType = context.getPaymentType();
log.info("[规则3] 支付路由选择:{}", paymentType);
// 根据支付类型返回不同的规则ID
if ("ALIPAY".equals(paymentType)) {
return Collections.singletonList("alipayRule");
} else if ("WECHAT".equals(paymentType)) {
return Collections.singletonList("wechatPayRule");
} else if ("BANK".equals(paymentType)) {
return Collections.singletonList("bankPayRule");
} else {
context.addError("不支持的支付方式:" + paymentType);
return Collections.emptyList();
}
}
}
```
### 5. 构建规则链
```java
@EngineComponent("orderChain")
public class OrderRuleBuilder implements RuleBuilder {
@Override
public RuleChain build() {
// 创建支付处理分支规则
RuleChain paymentRule = LiteRule.SWITCH("paymentRouteRule")
.TO("alipayRule", "wechatPayRule", "bankPayRule")
.build();
// 创建完整规则链
return LiteRule.THEN("orderValidateRule", "orderAmountRule")
.THEN(paymentRule)
.build();
}
}
```
### 6. 执行规则链
```java
import org.springblade.core.literule.provider.LiteRuleResponse;
@Autowired
private RuleEngineExecutor ruleEngine;
public void processOrder(OrderRequest request) {
// 构建上下文
OrderContext context = OrderContext.builder()
.orderId(request.getOrderId())
.amount(request.getAmount())
.paymentType(request.getPaymentType())
.shippingAddress(request.getAddress())
.build();
// 构建配置
RuleConfig config = RuleConfig.builder()
.enableTimeMonitor(true)
.printExecutionTime(true)
.enableLogging(true)
.build();
// 执行规则链
LiteRuleResponse<OrderContext> response = ruleEngine.execute(
"orderChain",
context,
config
);
// 处理响应
if (response.isSuccess()) {
log.info("规则执行成功,耗时: {}ms", response.getExecutionTime());
} else {
log.error("规则执行失败: {}", response.getMessage());
// 获取详细错误信息
context.getErrorMessages().forEach(error -> log.error("错误: {}", error));
}
}
```
### 7. 异步执行规则链
```java
@Autowired
private RuleEngineExecutor ruleEngine;
@Autowired
@Qualifier("ruleExecutorThreadPool")
private ThreadPoolExecutor threadPool;
public CompletableFuture<LiteRuleResponse<OrderContext>> processOrderAsync(OrderRequest request) {
// 构建上下文
OrderContext context = OrderContext.builder()
.orderId(request.getOrderId())
.amount(request.getAmount())
.paymentType(request.getPaymentType())
.build();
// 异步执行规则链
return ruleEngine.executeAsync(
"orderChain",
context,
threadPool
).thenApply(response -> {
if (response.isSuccess()) {
log.info("异步规则执行成功,耗时: {}ms", response.getExecutionTime());
} else {
log.error("异步规则执行失败: {}", response.getMessage());
}
return response;
});
}
```
## 核心概念
### 规则(Rule)
规则是业务逻辑的最小执行单元,分为两种类型:
- 普通规则(Rule): 执行固定的业务逻辑
- 分支规则(SwitchRule): 根据条件返回下一个要执行的规则列表
### 规则链(RuleChain)
规则链定义了规则的执行顺序,支持三种组合方式:
- THEN: 顺序执行一组规则
- SWITCH: 条件分支执行不同规则
- PARALLEL: 并行执行一组规则
### 规则上下文(RuleContext)
在规则执行过程中传递数据和状态的载体,包含:
- 上下文数据
- 错误信息
- 执行状态
- 执行时间统计
### 规则配置(RuleConfig)
控制规则执行的行为,包含:
- 是否启用执行时间监控
- 是否打印执行时间
- 是否启用日志
## 高级特性
### 1. 规则链缓存
规则引擎会自动缓存构建好的规则链,提高执行效率。缓存支持以下配置:
```yaml
literule:
cache:
enabled: true # 是否启用缓存
```
### 2. 规则预加载
在应用启动时预加载所有规则,提前发现配置错误,减少首次执行的延迟:
```yaml
literule:
preload:
enabled: true # 是否启用预加载
```
### 3. 并行执行配置
控制并行规则执行的行为:
```yaml
literule:
execution:
timeout: 30000 # 默认超时时间(毫秒)
enable-parallel: true # 是否启用并行执行
max-parallel-threads: 10 # 最大并行线程数
```
### 4. 循环依赖检测
规则引擎会自动检测规则链中的循环依赖,避免无限递归执行。
## 项目结构
```
blade-starter-literule/
├── annotation/ # 注解
│ ├── EngineComponent.java # 引擎组件注解
│ └── RuleComponent.java # 规则组件注解
├── builder/ # 规则构建
│ ├── LiteRule.java # 规则构建器
│ ├── RuleBuilder.java # 规则构建器接口
│ ├── RuleBuilderExecutor.java # 规则构建器执行器
│ └── chain/ # 规则链构建器
│ ├── AbstractRuleChain.java # 规则链抽象基类
│ ├── ParallelRuleChain.java # 并行规则链构建器
│ ├── RuleChain.java # 并行规则链接口
│ ├── SwitchRuleChain.java # 分支规则链构建器
│ └── ThenRuleChain.java # 顺序规则链构建器
├── config/ # 配置类
│ ├── AbstractComponentRegistrar.java # 组件注册器抽象基类
│ ├── EngineComponentRegistrar.java # 引擎组件注册器
│ ├── RuleComponentRegistrar.java # 规则组件注册器
│ ├── RuleEngineAutoConfiguration.java # 规则引擎自动配置
│ └── RuleEngineProperties.java # 规则引擎配置属性
├── context/ # 上下文管理
│ ├── RuleContextHolder.java # 规则上下文持有者
│ └── RuleContextManager.java # 规则上下文管理器
├── core/ # 核心实现
│ ├── AbstractBaseRule.java # 规则基类
│ ├── AbstractRule.java # 普通规则抽象实现
│ ├── AbstractRuleContext.java # 规则上下文抽象实现
│ └── AbstractSwitchRule.java # 分支规则抽象实现
├── engine/ # 规则引擎执行
│ ├── DefaultRuleEngineExecutor.java # 默认规则引擎执行器
│ ├── RuleEngineExecutor.java # 规则引擎执行器接口
│ └── RulePreloadRunner.java # 规则预加载服务
├── exception/ # 异常
│ └── RuleException.java # 规则异常
└── provider/ # 接口和模型
├── Rule.java # 规则接口
├── RuleConfig.java # 规则配置类
├── RuleContext.java # 规则上下文接口
├── RuleResponse.java # 规则响应类
└── SwitchRule.java # 分支规则接口
```
## 最佳实践
### 1. 规则设计原则
- **单一职责**:一个规则只做一件事,便于维护和测试
- **无状态**:规则不应保存状态,所有状态应通过上下文传递
- **幂等性**:多次执行结果一致,避免副作用
- **异常处理**:规则内部应处理异常,避免中断规则链执行
### 2. 规则链设计原则
- **层次清晰**:明确的执行顺序,避免复杂的嵌套
- **解耦合**:规则之间通过上下文交互,避免直接依赖
- **可维护**:便于添加、删除、修改规则,不影响整体流程
- **合理分组**:相关规则放在一起,便于理解和维护
### 3. 性能优化
- **合理使用缓存**:对于频繁执行的规则链,启用缓存
- **并行执行**:对于独立的规则,使用并行执行提高效率
- **异步执行**:对于耗时长的规则链,使用异步执行
- **资源管理**:及时清理上下文资源,避免内存泄漏
## 完整示例
参考 `org.springblade.test.literule.LiteRuleTest` 类,提供了完整的使用示例。