当青训营遇上码上掘金,这是我参与「第五届青训营」伴学笔记创作活动的第2天,主要是对go的一些内存进行巩固。
大致介绍规则引擎在 golang 中的使用,将介绍 golang 中主要的规则引擎框架,然后利用 golang 原生的 parser 搭建一个简单的规则引擎实现基本的 bool 表达式解析工作。
规则引擎介绍
规则引擎由是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策
parser 库介绍
Go 内置的 parser 库提供了 golang 底层语法分析的相关操作,并且其相关的 api 向用户开放,那么便可以直接使用 Go 的内置parser 库完成上面一个基本规则引擎的框架。
MbDQVaVT - 码上掘金 (juejin.cn)
// 使用go语法表示的bool表达式,in_array为函数调用 expr := product_id == "3" && order_type == "0" && in_array(capacity_level, []string{"900","1100"}) && carpool_type == "0"`
// 使用go parser解析上述表达式,返回结果为一颗ast parseResult, err := parser.ParseExpr(expr) if err != nil { fmt.Println(err) return }
// 打印该ast ast.Print(nil, parseResult)` 其实也可以关注一下Yao Yao 基于 flow-based 编程思想,采用 Go 语言开发,支持多种方式扩展数据流处理器。这使得 Yao 具有极好的通用性,大部分场景下可以代替编程语言, 在复用性和编码效率上是传统编程语言的 10 倍;应用性能和资源占比上优于 PHP, JAVA 等语言。 Yao 内置了一套数据管理系统,通过编写 JSON 描述界面布局,即可实现 90% 常见界面交互功能,特别适合快速制作各类管理后台、CRM、ERP 等企业内部系统。对于特殊交互功能亦可通过编写扩展组件或 HTML 页面的方式实现。内置管理系统与 Yao 并不耦合,亦可采用 VUE, React 等任意前端技术实现管理界面。
parser
有了 Golang 原生的语法解析器,我们只需要后序遍历这棵二叉树,然后实现一套 AST 与对应数据map的映射关系即可实现一个简单的规则引擎。 RgFSdFeU - 码上掘金 (juejin.cn)
可以看到在使用原生的 parser 实现的规则引擎在性能上具有较大的优势,但缺点在于需要自己实现一套 AST 与对应数据map的映射关系,并且受限于 go 原生 parser 库的限制导致规则的定义语言比较繁琐,这些也都是为什么会有其他规则引擎框架诞生的原因,但不可否认基于原生 parser 库打造的规则引擎的性能还是足够优秀的,因此在一些比较简单的规则匹配场景中还是优先考虑使用原生 parser,可以最大效率的实现降本增效的效果。