新年第一课 规则引擎 | 青训营笔记

101 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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。

  1. DataContext:用于注入规则中需要使用的数据或者API。
  2. RuleBuilder:接收DataContext作为参数,并将用户传入的字符串构建出可执行的代码。
  3. Gengine:接收构建好的RuleBuilder,使用不同的模式执行规则。
  4. GenginePool:Gengine的实例池,提供线程安全的API,以供用户在高QPS下使用。也推荐直接使用GenginePool。

gengine的使用大致分为下面的步骤:

  1. 创建DataContext,并将规则使用的数据注入。
  2. 使用1中的DataContext作为参数实例化RuleBuilder并构建规则代码。
  3. 创建Gengine,按照模式执行2构建的规则代码。