规则引擎作用
规则引擎主要用于将业务逻辑从应用程序代码中分离出来,提高系统的灵活性和可维护性。规则引擎通过预定义的规则来处理输入数据并做出相应的决策,从而实现业务逻辑的自动化和动态调整。
例如
- 门店信息校验:美团点评在门店信息校验过程中使用规则引擎,对门店信息进行质量控制。规则包括分支条件、简单计算规则和业务定制计算规则等。通过规则引擎,门店信息校验过程变得更加高效和准确。
业务场景说明
不同会员的折扣率不同
代码结构
集成 Drools(即规则引擎)到 Spring Boot 可以帮助你实现业务规则的动态管理和执行。下面我来简要说明一下业务场景和代码实现的步骤:
1. 添加依赖
首先,需要在 pom.xml
文件中添加 Drools 的依赖:
<!-- drools规则引擎 -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.6.0.Final</version>
</dependency>
2. 创建规则文件
在项目的src/main/resources目录下创建一个名为rules的文件夹,并在其中创建一个名为sample.drl的规则文件:
package com.song;
import com.song.rulesobj.Customer
rule "ORDINARY-Customers"
when
customer: Customer(type == "ORDINARY")
then
customer.setDiscount(0.9*customer.getOriginalPrice()); // 9折 普通会员
end
rule "VIP-Customers"
when
customer: Customer(type == "VIP")
then
customer.setDiscount(0.6*customer.getOriginalPrice()); // 6折 VIP会员
end
rule "SVIP-Customers"
when
customer: Customer(type == "SVIP")
then
customer.setDiscount(0.4*customer.getOriginalPrice()); // 4折 SVIP会员
end
3. 定义实体类
创建一个简单的实体类 Customer
,用于表示客户信息:
package com.song.rulesobj;
import lombok.Data;
@Data
public class Customer {
/**
* 客户类型
*/
private String type;
/**
* 客户订单价格
*/
private Double originalPrice; // 订单原始价格,即优惠前的价格
/**
* 优惠后最终结算价格
*/
private Double discount;
}
4. 配置 Drools 规则引擎
在 Spring Boot 应用程序中配置 Drools 规则引擎的 bean:
package com.song.conf;
import com.song.bean.DiscountBean;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DroolsConfig {
@Bean
public KieContainer kieContainer() {
KieServices kieServices = KieServices.Factory.get();
KieRepository kieRepository = kieServices.getRepository();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
kieFileSystem.write(kieServices.getResources().newClassPathResource("rules/sample.drl"));
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
}
@Bean
public KieSession kieSession() {
return kieContainer().newKieSession();
}
@Bean
public DiscountBean discountBean() {
return new DiscountBean(kieSession());
}
}
5. 应用规则引擎
在业务代码中使用注入的 KieSession
执行规则:
/*******************************************************************************
* Package: com.song.bean
* Type: DiscountService
* Date: 2024-06-28 13:45
*
* Copyright (c) 2024 LTD All Rights Reserved.
*
* You may not use this file except in compliance with the License.
*******************************************************************************/
package com.song.bean;
import com.song.rulesobj.Customer;
import org.kie.api.runtime.KieSession;
/**
* 功能描述: 规则处理器封装
*
* @author Songxianyang
* @date 2024-06-28 13:45
*/
public class DiscountBean {
private KieSession kieSession;
public DiscountBean(KieSession kieSession) {
this.kieSession = kieSession;
}
public void applyDiscount(Customer customer) {
kieSession.insert(customer); // 插入客户对象到规则引擎中
kieSession.fireAllRules(); // 执行规则
// 客户对象已经被更新,包含了计算出的折扣
System.out.println("客户订单价格"+customer.getOriginalPrice()+"客户折扣类型: " + customer.getType() + ", 优惠后最终结算价格: " + customer.getDiscount());
}
}
6. 测试规则引擎
编写一个简单的测试类来验证规则引擎是否按预期工作:
package com.song.web;
import com.song.bean.DiscountBean;
import com.song.common.annotation.ResponseInfoSkin;
import com.song.rulesobj.Customer;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Api(tags = "规则引擎")
@ResponseInfoSkin
public class DemoController {
@Autowired
private DiscountBean discountBean;
@PostMapping("/discount")
@ApiOperation("打折")
public Double discount(@RequestBody Customer customer) {
// 规则处理器封装
discountBean.applyDiscount(customer);
return customer.getDiscount();
}
}
测试截图
总结
通过上述步骤,你可以将 Drools 规则引擎集成到 Spring Boot 应用程序中,并使用规则文件动态管理业务规则,实现不同客户类型的动态折扣计算。这种方式可以使得业务规则更易于维护和修改,同时与应用程序解耦,提高了灵活性和可维护性。