本帖最后由 keer_zu 于 2020-12-18 11:57 编辑
#申请原创# 参考
参考实现
规则引擎微服务提供了一个参考实现,边缘事件触发机制。规则引擎服务监视传入的传感器或设备数据,以在目标范围内读取数据,并立即触发设备启动。因此,规则引擎在网络边缘或附近提供“智能”以获得更快的响应时间。
实现在其核心使用Drools (https://www.drools.org/)规则引擎。Drools是JBoss社区提供的一个开源规则引擎。这种微服务可以被第三方提供的许多其他边缘分析功能所取代或增强。
规则引擎作为导出服务客户端
参考实现规则引擎是一个自动导出服务客户机。当服务启动时,它会自动调用导出客户端注册微服务,将自己注册为所有来自核心数据的设备和传感器读数的客户端。作为导出服务客户端,引用实现规则引擎通过导出分发微服务接收所有事件和读数。在数据的基础上,参考实现规则引擎指示监控每个事件和阅读通过export distribution微服务收到,和规则引擎触发任何驱动装置通过Core Command微服务(随后通过Device Service与实际设备通信来发送请求)。
规则引擎直接连接到核心数据
规则引擎已经为此选项编写了程序。默认情况下,规则引擎微服务将自身注册为导出服务的客户机。可以关闭这种自动注册,规则引擎可以直接连接到Core data外的ZeroMQ发布的数据。注意:由于ZeroMQ从Core Data发出的管道是一种发布-订阅机制,因此它允许多个订阅者。当规则引擎作为订阅者连接时,核心数据实际上是同时发布到两个客户端或订阅者:导出服务和规则引擎。为了断开规则引擎与导出服务(作为客户机)的连接并直接连接到核心数据,必须更改以下规则引擎微服务配置参数(可以在application.properties中找到)
export.client=true # this is normally false by default and is the indication to the Rules Engine micro service to register itself with the Export Services
export.zeromq.port=5563 # this port is set to 5566 when connecting to the ZeroMQ pipe out of Export Services.
export.zeromq.host=tcp://[core data host] # this is set to the export distro host when connecting to the ZeroMQ pipe out of Export Services
规则客户端和高层交互关系图
规则引擎微服务附带一个RESTful服务,支持添加和删除新规则。RESTful API允许将JSON中定义的新规则动态添加到规则引擎中(通过REST POST)。提供的JSON数据被转换为Drools规则文件(。drl文件)通过微服务。每个规则必须与一个惟一的名称相关联,该名称用于标识规则和保存规则的Drool文件。也可以要求按名称删除规则。
注意:由于Drools内部的问题,删除的规则只会清空内容。规则的名称(以及表示规则的文件)仍然在系统中。因此,在停止规则引擎微服务并物理删除空Drool文件之前,不能重用规则名称。
规则(定义的)和数据模型
规则直接通过规则引擎REST API或间接使用客户端UI提供给规则引擎微服务。
规则由4个部分定义:名称、日志条目、条件和操作。
名字
名称唯一地标识规则。
日志条目
日志条目,或简单的日志,是在满足规则条件并触发操作时发送到日志的文本。
条件
条件指定要监视的数据(来自通过导出服务提供的事件/读取数据)。具体地说,规则的condition元素指定要监视的设备ID或设备名称,以及要对在该设备上收集的传感器值执行的值检查(或简单地称为“检查”)。设备ID或名称必须与由Core Data发送到导出服务,然后转发到规则引擎服务(通过0MQ)的事件对象中指定的设备ID或名称匹配。
值检查指定要监视和测试的传感器的参数以应用于该参数。ValueCheck参数必须匹配CoreData提供的与事件相关的读取名称之一(也是合法的ValueDescriptor的名称)。例如,在恒温器传感器上,读数可能报告当前温度。因此,读取名称应该是temperature,为了让规则测试从这个传感器读取的数据,对同一设备的值检查必须包含一个温度参数。operand1、operation和operand2必须围绕参数指定一个等式,规则引擎使用该参数来确定是否触发操作。例如,一个ValueCheck希望指定给规则引擎,以检查任何高于72度的温度的所有温度读数,它将指定如下:
parameter: temperature
operand1: value
operation: >
operand2: 72
因为事件读取中的数据可能以字符串形式报告,所以ValueCheck操作数可以也应该使用Java语法指定,该语法在求值之前进行协商,以创建用于比较的适当类型数据。如果Core Data中的温度读数被表示为字符串,那么相同的ValueCheck将被指定如下:
parameter: temperature
operand1: Integer.parseInt(value)
operation: >
operand2: 72
最后,规则中指定的动作指定在设备或传感器上触发哪个命令,以及作为该调用的一部分发送给设备的哪些数据或参数。实际调用是通过REST形式的核心命令微服务进行的。因此,操作必须指定以下项目:
- 要调用的设备标识符(每个元数据)
- 要对设备执行的命令标识符(每个元数据)
- 作为命令调用的一部分提供的数据
因此,作为调用的一部分提供的数据是将在命令POST调用的主体中提供的JSON数据。动作属性的一个例子如下:
device: 56325f7ee4b05eaae5a89ce1(元数据中设备或传感器的标识符)
command: 56325f6de4b05eaae5a89cdc (每个元数据与设备关联的命令ID)
body: {"value":"3"}(REST消息体中提供的JSON数据)。
当在JSON中创建一个规则并通过规则引擎客户端提交时,整个规则将如下所示:
{"name":"motortoofastsignal", "condition": {"device":"562114e9e4b0385849b96cd8","checks":[ {"parameter":"RPM", "operand1":"Integer.parseInt(value)", "operation":">","operand2":"1200" } ] }, "action" : {"device":"56325f7ee4b05eaae5a89ce1","command":"56325f6de4b05eaae5a89cdc","body":"{\\\"value\\\":\\\"3\\\"}"},"log":"Patlite warning triggered for engine speed too high" }
规则引擎配置
规则引擎微服务有几个特定于规则引擎操作的配置属性。额外的配置,比如microservice的服务器端口,是EdgeX microservices中的标准配置,这里将不予讨论。规则引擎微服务中的关键属性位于application.properties中。请注意,源代码包含一个应用程序。在/src/main/resources文件夹中的属性文件,作为开发环境(通常)与应用程序的默认值。属性,该属性为微服务的docker-files版本提供标准默认值。下面显示的示例来自/src/main/resources默认值。
自动规则引擎作为一个导出发行版客户端
当规则引擎微服务出现时,为了从EdgeX接收数据(传感器事件/读数),它会通过导出客户端微服务自动注册为导出数据客户端。如果您不希望规则引擎自动从导出服务(即导出发行版)接收该数据,则设置export。客户端为false。
特别地,如前所述,您可能希望规则引擎微服务直接从核心数据接收数据,而不是从导出服务接收数据,因此可能希望导出。客户端设置为false。
规则引擎导出分发注册
export.client.registration.url=http://localhost:48071/api/v1export.client.registration.name=EdgeXRulesEngine
#how long to wait to retry registration
export.client.registration.retry.time=10000
#how many times to try registration before exiting
export.client.registration.retry.attempts=100
如果出口。客户端设置为true的规则引擎microservice出口服务的客户机,然后附加属性需要指定指示出口的位置客户登记microservice(这可能不同/环境——就像在开发和码头工人的环境),和规则引擎的名称使用出口客户端注册时规则引擎。
Core Data的零MQ连接信息
export.zeromq.port=5566
export.zeromq.host=tcp://localhost
如前所述,在规则引擎直接连接到核心数据部分中,如果规则引擎要直接连接到来自核心数据的数据提要(ZeroMQ),则必须提供附加属性来指定订阅核心数据提要的端口和地址。同样,它们可能因环境而异(例如本地开发与Dockerized环境)。
Drools模板的位置和名称
#Drools drl resource path
rules.default.path=edgex/rules
rules.packagename=org.edgexfoundry.rules
rules.fileextension=.drl
rules.template.path=edgex/templates
rules.template.name=rule-template.drl
rules.template.encoding=UTF-8
规则引擎在幕后使用Drools。当通过规则引擎微服务api创建新规则时,规则引擎必须能够访问用于创建新规则的基本模板(默认情况下扩展名为.drl的Drool文件)。该模板携带特定的导入和EdgeX设备命令调用结构,规则引擎使用该结构来监视传入数据并通过命令微服务驱动设备/传感器。模板的位置、模板文件的名称以及与模板相关的其他属性必须在配置属性中指定。通常,每个环境中只有模板文件的位置会改变。
数据字典
[td]Class Name
| Descrption
| Action
| The command that is executed when a Condition is met. | Condition
| The object describing the device and its ValueCheck condition that embodies a Rule. | Rule
| The object containing the Condition and Action that define the Rule. | ValueCheck
| The mathematical expression evaluated for a Condition. |
|