这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
新年第一课 规则引擎
背景
随着业务代码的不断迭代,诞生出了越来越多的 if-else,并且 if-else 中的逻辑越来越复杂,导致代码逻辑复杂、维护性差、可读性差、修改风险高等缺陷。
复杂的 if-else 逻辑其实对应的是一条条的规则,满足对应的规则在执行对应的操作,即 if-else 中的条件就是一个对应的 bool 表达式:
|--bool 表达式--|
if a == 1 && b == 2 {
// do some business
}
一个复杂的逻辑表示一条对应的规则,将这些规则用 bool 表达式表示之后,便可以按照对应的规则执行操作,大大减少 if-else 的应用:
if 规则 {
// do some business
}
而如何解析这些 bool 表达式便是规则引擎所需要完成的任务了。
规则引擎介绍
规则引擎由是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。
基于Go parser库打造规则引擎
parser 库介绍
Go 内置的 parser 库提供了 golang 底层语法分析的相关操作,并且其相关的 api 向用户开放,那么便可以直接使用 Go 的内置 parser 库 完成上面一个基本规则引擎的框架。
核心API
对于gengine的使用,我们先掌握几个核心的API。
- DataContext:用于注入规则中需要使用的数据或者API。
- RuleBuilder:接收DataContext作为参数,并将用户传入的字符串构建出可执行的代码。
- Gengine:接收构建好的RuleBuilder,使用不同的模式执行规则。
- GenginePool:Gengine的实例池,提供线程安全的API,以供用户在高QPS下使用。也推荐直接使用GenginePool。
gengine的使用大致分为下面的步骤:
- 创建DataContext,并将规则使用的数据注入。
- 使用1中的DataContext作为参数实例化RuleBuilder并构建规则代码。
- 创建Gengine,按照模式执行2构建的规则代码。