https://blog.csdn.net/kisscatforever/article/details/80784675
https://blog.csdn.net/wo541075754/article/details/76566016
https://blog.csdn.net/moshowgame/article/details/98061651
http://www.360doc.com/content/19/0513/16/58342994_835422644.shtml
http://www.360doc.com/showweb/0/0/874593555.aspx
对于业务复杂多变的项目存在的问题
1,当业务规则变更时,对应的代码也得跟着更改,每次即使是小的变更都需要经理开发,测试验证上线等过程。,变更成本比较大。
2,长时间系统变得越来越难以维护。
3, 开发团队一般是由一个熟悉业务的BA(业务分析人员)和若干个熟悉技术的开发人员组成,开发人员对业务规则的把握能力远不及BA,但实际上却承担了将业务规则准确无误实现的重任。
4,系统僵化,新需求插入困难。
5,新需求上线周期长。
规则引擎能帮助我们什么?
我们知道了,规则引擎是为了解决复杂多变的业务,并且快速的数据计算。他可以把规则和核心业务拆开,规则单独配置。这样当我们规则变化的时候,通过修改规则文件而不用修改核心的代码了。
什么样的项目适合使用规则引擎
规则引擎使用较为广泛,并不能说只适合几个领域,应该说,在规则较为复杂的行业,都是适用的,如金融,制造,医疗,物流等行业,面临的规则较为复杂,而且对规则引擎需求的行业也越来越多、如团购平台,传统企业管理渠道等,等都存在大量快速变化的业务规则。如何快速应对,已经成为挑战,谁能快速适应,谁就能一马当先。
JBoss Drools
Drools规则引擎介绍Drools是JBoss公司旗下一款开源的规则引擎,它完整的实现了Rete算法;提供了强大的EClipsePlugin开发支持。通过使用其中的DSL(DomainSpecificLanguage),可以实现用自然语言方式来描述业务规则,使得业务分析人员也可以看懂业务规则,使得业务分析人员也可以看懂业务规则代码。最新版本Drools5提供了基于WEB的BRMS--Guvnor提供了规则管理的知识库,通过它可以实现规则的版本控制,以及规则的在线修改和编译,使得开发人员和系统管理人员可以在线管理业务规则。
SpringBoot 结合Drools实现规则引擎
宏观说说Drools文件;
搭建springboot框架,引入Drools依赖;
4.0.0
com.wl
drools
0.0.1-SNAPSHOT
jar
drools
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.14.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.drools
drools-core
7.0.0.Final
org.drools
drools-compiler
7.0.0.Final
org.drools
drools-decisiontables
7.0.0.Final
org.drools
drools-templates
7.0.0.Final
org.kie
kie-api
7.0.0.Final
org.projectlombok
lombok
1.16.20
provided
org.springframework.boot
spring-boot-starter-web
maven-compiler-plugin
org.springframework.boot
spring-boot-maven-plugin
org.codehaus.mojo
exec-maven-plugin
java
com.galaxyyao.springbootdroolstest1.SpringBootDroolsTest1Application
在src/main/resources下添加2个目录:
META-INF和rules
META-INF下添加kmodule.xml,内容如下:
规则文件:
rules目录下添加一个简单的hello World规则:
package com.galaxyyao.springbootdroolstest1
import com.wl.drools.domain.Message
dialect "mvel"
rule "Hello World"
dialect "mvel"
when
m : Message(status.equals(Message.HELLO), message : message )
then
System.out.println( message);
modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE };
end
rule "Good Bye"
dialect "java"
when
Message( status == Message.GOODBYE, message : message )
then
System.out.println( message );
end
Domain层
Domain层定义一个Drools中需要使用到的Model:
package com.wl.drools.domain;
import lombok.Data;
/**
* Created by Ares on 2018/6/23.
*/
@Data
public class Message {
public static final Integer HELLO = 0;
public static final Integer GOODBYE = 1;
private String message;
private Integer status;
}
service层:
public interface DroolsService {
String fireRule();
}
serviceimpl层
package com.wl.drools.service.impl;
import com.wl.drools.domain.Message;
import com.wl.drools.service.DroolsService;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.stereotype.Service;
/**
* Created by Ares on 2018/6/23.
*/
@Service("droolsService")
public class DroolsServiceImpl implements DroolsService {
public String fireRule() {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
Message message = new Message();
message.setMessage("Hello World");
message.setStatus(Message.HELLO);
kSession.insert(message);//插入
kSession.fireAllRules();//执行规则
kSession.dispose();
return message.getMessage();
}
}
controller层:
package com.wl.drools.controller;
import com.wl.drools.service.DroolsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private DroolsService droolsService;
@GetMapping("/showRults")
public String showRults(){
return droolsService.fireRule();
}
@GetMapping("/testBoot")
public String testBoot(){
return "123456";
}
}
通过访问[http://localhost:8080/test/showRults](http://localhost:8080/test/showRults),显示如下:
当我们的规则发生变化的时候,我们就修改规则文件,就可以了。