规则引擎设计与实现| 青训营笔记
这是我参与「第五届青训营 」笔记创作活动的第6天
今天主要对规则引擎设计与实现进行学习。
一、本堂课重点内容:
本次课程讲了以下几个方面:
1.认识规则引擎
2.编译原理基本概念
3.设计一个规则引擎
4.规则引擎的实现
二、详细知识点介绍:
1.认识规则引擎
规则引擎的官方解释是一种嵌入在应用服务中的组件,可以将灵活多变的业务决策从服务代码中分离出来。通过使用预定义的语义模块来编写业务逻辑规则。在执行时接受数据输入、解释业务规则,并做出决策。规则引擎能大大提高系统的灵活性和扩展性。 之所以使用规则引擎是因为我们在项目开发的过程中无法确定某些具体的业务需求,随着项目的上线运行,会有许多不在开发项目时的需求产生,这个时候我们使用规则引擎来解决这个痛点。使用规则引擎我们可以避免重复编码的问题,同时还可以提升服务的可维护性,提升开发效率。下图是未使用规则引擎和使用规则引擎的流程对比。
2.编译原理基本概念
编译的过程就是 把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序(目标语言程序)。通俗来说就是将我们所写的内容转化为计算机可以理解的内容。如下图:
1.词法分析
词法分析就是把源代码字符串转换为词法单元(Token)的这个过程,具体情况如下状态机:
该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换。
2.语法分析和抽象语法树
词法分析是识别一个个的单词,而语法分析就是在词法分析的基础上识别出程序的语法结构。这个结构是一个树状结构。这棵树叫做抽象语法树(Abstract Syntax Tree,AST)。
3.类型检查
类型检查分为编译时检查和运行时检查两种。
3.设计一个规则引擎
设计一个规则引擎包括以下几个步骤:
1.设计目标:设计一个规则引擎,支持特定的词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行。
2.词法分析:设计词法分析的状态机
3.语法分析
4.执行语法树和类型检查。
三、实践练习例子(规则引擎的实现):
由于该部分内容我没有学明白,所以对于实现部分仅当作了解,项目具体地址为:项目地址。结合Hertz框架的入口文件代码如下:
// Code generated by hertz generator.
package main
import (
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/qimengxingyuan/young_engine/biz/dal"
"github.com/qimengxingyuan/young_engine/biz/handler"
)
func main() {
Init()
r := server.Default()
r.GET("/ping", handler.Ping)
g := r.Group("/api")
g.POST("/engine/run", handler.HandleRunRule)
g.POST("/engine/exp/new", handler.HandleAddExpression)
g.GET("/engine/exp/list", handler.HandleGetAllExpression)
g.DELETE("/engine/exp/:id", handler.HandleDeleteExpression)
g.POST("/engine/exp/run", handler.HandleRunExpression)
r.Spin()
}
func Init() {
dal.InitDB()
}
四、课后个人总结:
通过对规则引擎的课程学习,我了解到了规则引擎的基本概念,通俗来说就是规则引擎可以把复杂、重复的业务规则同各个业务系统分离开。在执行时接受数据输入、解释业务规则,并做出决策,使其程序具有更高的灵活性和可用性。最后,在课程中还接触了设计并实现一个规则引擎,加强了我对于规则引擎这部分知识点的理解。