From 08b22cfbb42d630eee7773936b5653a2305272d2 Mon Sep 17 00:00:00 2001 From: yinweiwen Date: Thu, 17 Jun 2021 10:50:00 +0800 Subject: [PATCH] =?UTF-8?q?(+)=20=E8=A7=84=E5=88=99=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../规则引擎/image-20210616140457382.png | Bin 0 -> 8442 bytes .../规则引擎/image-20210616160110681.png | Bin 0 -> 30883 bytes 预研项目/规则引擎.md | 280 ++++++++++++++++++ 3 files changed, 280 insertions(+) create mode 100644 预研项目/imgs/规则引擎/image-20210616140457382.png create mode 100644 预研项目/imgs/规则引擎/image-20210616160110681.png create mode 100644 预研项目/规则引擎.md diff --git a/预研项目/imgs/规则引擎/image-20210616140457382.png b/预研项目/imgs/规则引擎/image-20210616140457382.png new file mode 100644 index 0000000000000000000000000000000000000000..b83f2a22d0cfff411a5cb882ff85467bb3367841 GIT binary patch literal 8442 zcmaia1ymeM6YjFOyThWvB}j004;}&p2m}ibi^Jjs36>BvcyNaR!7WITpkZ;?;O=g3 z$-V#o{(H|m=gsM}Gh5x;RrPhxPE~yqsi~oejX{9{006L+mE^Pm0AM`)IuH#7{@HT- z@;3lL3s9Dm*7f?lw_v1Z&c#`rgB z;o&YFy`2IAX79OgI(td0UUQmud|w(-b*MahD1XQe_)YUL_W?Pila{e+Zg2E$op#hy z&)p z2F}$TruZn#%UcYJFe4AKXtSqpHo2Xt=G)Uh&PVtv`GUR8K6mFB(vz$n`ajp;SBsUG zHIavpa_|E9;Kegn{4`!{&AMl>tD2*uBU%6&q1F55mcyh5Wf-YwfJvqnU5;u(3a6dD(dp4CmqAX$H&() zOpzjhpA#6>Xd@#cB9uPZ0B76@wpHnqeFz`>7tL`Q;b(m1E~F3e{s_j`KxH}j@!@F@ z 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 TlvJzX4gi$pHRLK}%!2<9sT$Bz literal 0 HcmV?d00001 diff --git a/预研项目/imgs/规则引擎/image-20210616160110681.png b/预研项目/imgs/规则引擎/image-20210616160110681.png new file mode 100644 index 0000000000000000000000000000000000000000..e91bb8444f290816a044429e0292653ada2acead GIT binary patch literal 30883 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 literal 0 HcmV?d00001 diff --git a/预研项目/规则引擎.md b/预研项目/规则引擎.md new file mode 100644 index 0000000..5b0967b --- /dev/null +++ b/预研项目/规则引擎.md @@ -0,0 +1,280 @@ +# 规则引擎 + +实现业务和代码的分离,即把业务逻辑抽离,实现规则和系统的解耦。 数据输入-> 业务规则解释 -> 做出业务决策。 + +适用于复杂、多变的业务场景。 + +`原先一堆 case 的逻辑,改由规则引擎控制,对频繁修改的业务规则提高修改效率` + +### [Drools](https://github.com/kiegroup/drools) + +Drools是一个基于Java的**开源**规则引擎。 + +Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法对所编写的规则求值。Drools 允许使用声明方式表达业务逻辑。可以使用非 XML 的本地语言编写规则,从而便于学习和理解。并且,还可以将 Java 代码直接嵌入到规则文件中,这令 Drools 的学习更加吸引人。 + +`ksession-rules.drl` + +```yaml +package com.rules +import model.ProtocolType +dialect "java" + +rule "jk16" + when + $protocol : ProtocolType(data matches "^1A12.*$" ) + then + $protocol.setType("xx燃气表协议"); + System.out.println("触发规则1:"+$protocol.getData()); + end + +rule "jkstd" + no-loop true + lock-on-active true + salience 1 + when + $protocol : ProtocolType(data matches "18.*",length == 10) + then + $protocol.setType("xx水表标准协议"); + System.out.println("触发规则2:"+$protocol.getData()); + end +``` + +`main.java` + +```java +public static void main(String[] args) { + KieServices ks = KieServices.Factory.get(); + KieContainer kContainer = ks.getKieClasspathContainer(); + KieSession kSession = kContainer.newKieSession("ksession-rules"); + + ProtocolType pt = new ProtocolType(); + pt.setData("1A122312345"); + + kSession.insert(pt); + kSession.fireAllRules(); + kSession.dispose(); + System.out.println(pt); +} +``` + + + +### Ilog JRules + +Ilog Jrules是完整的业务规则管理系统(BRMS),它提供了对整个企业业务规则进行建模、编写、测试、部署和维护所必需的所有工具。 + + + +### Easy Rules + +[Github](https://github.com/EasyRules/easyrules.git) + ++ 轻量级 简单易用的API ++ 基于POJO 注解开发模型 ++ 通过高效的抽象来定义业务规则并轻松应用它们 ++ 支持创建复合规则 ++ 支持通过表达式语句创建规则(MVEL,SpEL,JEXL等) + +scala改写官方start: + +```scala +object main { + + def main(args: Array[String]): Unit = { + println("hello rule engine") + + val rule = new MyRule() + rule.bRain = true + val ruleEngine = RulesEngineBuilder.aNewRulesEngine().build() + ruleEngine.registerRule(rule) + + ruleEngine.fireRules() + } +} + +@Rule(name = "my rule", description = "test rule") +class MyRule() { + var bRain = false + + @Condition + def itRains(): Boolean = { + bRain + } + + @Action + def doSomething(): Unit = { + println("it rains") + } +} +``` + +在最新版本中才支持表达式语句创建 + +下载git代码并mvn install后本地库使用 + +```xml + + + org.jeasy + easy-rules-core + 4.1.1-SNAPSHOT + + + + org.jeasy + easy-rules-mvel + 4.1.1-SNAPSHOT + + +``` + +`weather-rule.yml` + +```yml +name: "weather rule" +description: "if it rains then take an umbrella" +condition: "rain == true" +actions: + - "System.out.println(\"It rains, take an umbrella!\");" +``` + + + +```scala +def main(args: Array[String]): Unit = { + val ruleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader) + val source = Source.fromInputStream(getClass.getResourceAsStream("/weather-rule.yml")) + val weatherRule = ruleFactory.createRule(source.bufferedReader()) + source.close() + + val facts = new Facts() + facts.put("rain", true) + + val rules = new Rules() + rules.register(weatherRule) + + val rulesEngine = new DefaultRulesEngine() + rulesEngine.fire(rules, facts) +} +``` + +构想的一个应用场景: + +[代码](https://github.com/yinweiwen/easy-rules-scala-example) + +根据测点属性或数据,来判断需要执行哪些操作: + +```scala +def handle(data: StationData): Unit = { + val facts = new Facts() + facts.put("sensor", BoxData(data)) + + engine.fire(rules, facts) +} + +// 需要把待处理数据进行封装 +// like a POJO +case class BoxData(var data: StationData) { + def validate(): Unit = { + data = Validator.handle(data) + } + + def analyze(): Unit = { + data = Analyzer.handle(data) + } + + def storage(): Unit = { + Storage.handle(data) + } +} +``` + +构造规则:例如温度超过30时执行指定过滤和分析操作。 +```yaml +name: "sensor rule" +description: "sensor handle rule" +condition: "sensor.data.v(\"temperature\")>30" +condition: "true" +actions: + - "System.out.println(sensor);" + - "sensor.validate();" + - "sensor.analyze();" +``` + + + +### [Node-Red](https://nodered.org/) + +__Low-code programming for event-driven applications__ + +[**概念**](https://nodered.org/docs/user-guide/) + +`Node` 节点 、`Flow` 流程 、Workspace 工作区间、Subflow 子流程、Sidebar 侧边栏、Palette调色板、Wire连接线 + +**安装** + +```shell +#windows +npm install --global --production windows-build-tools + +npm install -g --unsafe-perm node-red + +http://localhost:1880/ +``` + +%user%\\.node-red\settings.js + +```js +adminAuth: { + type: "credentials", + users: [{ + username: "admin", + password: "$2a$10$DFRjJdlRX/wEw3C.qyEdW.UyOGlPkGv8lbyZnuh6XX/4RVSQS.ZgO", // bcrypt随机带盐加密 + permissions: "*" // read write + }], + sessionExpiryTime: 86400, +}, +``` + +First Flow: Inject->Function->Debug + +![image-20210616140457382](imgs/规则引擎/image-20210616140457382.png) + +Second Flow: + +安心云数据处理 + + + +安心云的上报流程 + +![image-20210616160110681](imgs/规则引擎/image-20210616160110681.png) + +总结**一般**的推送流程: + +Kafka消费ET处理后的测点数据 --> 过滤结构物、监测因素 --> 构造发送消息结构体 --> 网络请求(http/tcp...) + +> 通过这种方式可以实现简单的数据上报功能, +> +> 1. 可视化配置,灵活高效 +> 2. 可开放作为平台功能的一部分,让有一定开发能力的客户直接使用。 +> 3. 可以匹配大多数接入方式场景 +> +> 主要存在的缺陷: +> +> 1. 每个项目独立启动一个Kafka-consumer消费者,性能浪费 +> 2. 状态数据没法处理(计算变化量等情况) +> 3. “函数”节点中纯js代码不支持Redis/Db等操作 +> 4. 自带的HTTP请求node较简单,不支持参数头设置。 +> 5. 请求返回校验和日志记录问题 +> 6. 不支持的场景:数据库直接写入、webservice接入等 +> 7. 自定义node仅支持Node.js语言 + +综上:只能实现逻辑较为简单的一些上报,可作为平台扩展功能一部分。大多数针对项目的上报,存在后处理逻辑,目前只能通过硬编码的方式实现。 + + + +EI 边缘计算 + +低时延、大带宽、大连接、本地化 +