【实践课】规则引擎设计与实现|青训营笔记

134 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第6天

【实践课】规则引擎设计与实现

课程目标

image.png

课前预习部分

规则引擎

规则引擎的本质呢就是我们自己定义一套语法,然后去解析用这套语法写的表达式,然后根据解析的内容执行表达式。这个过程其实就是编译和执行的过程。

编译过程经历的四个阶段

预处理——编译——汇编——链接

编译:将预处理后的文件经过词法分析、语法分析、语义分析、代码优化后转换为汇编代码文件

汇编:将汇编代码解释为二进制的机器指令

链接:把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接

在linux下执行一段C代码,可以将这四个步骤依次进行, 各阶段的指令如下:

预处理:gcc -E test.c -o test.i 编译:gcc -S test.i -o test.s 汇编:gcc -c test.s -o test.o 链接:gcc test.o -o test.exe 运行:./test.exe

img

课中

规则引擎(简而言之就是可以直接输入需求,然后直接实现业务逻辑)

image.png

组成部分

数据输入

规则理解

规则执行

应用场景

编译原理基本概念

词法分析

将源代码字符串转化为词法单元(Token)的过程

image.png

image.png

语法分析

在词法分析的基础上,识别表达式的语法结构的过程。语法结构一般用抽象语法树来表示,如图:

图中的每个结点都是第一步词法分析中产生的Token

image.png

抽象语法树

image.png

:左边的式子可以由:右边已知的式子推出

如下图,mul可以由pri表示或者由mul ‘*’ pri表示

image.png

利用递归下降算法来自顶向下构造出抽象语法树

类型检查

类型综合:根据子表达式的类型构造出父表达式类型。例如,A+B的类型是由A和B的类型定义

编译时检查&&运行时检查

image.png

设计一个规则引擎

目标:设计一个规则引擎,支持特定词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行

词法(合法Token)

image.png

词法分析

利用有限状态机来实现

image.png

快速上手Hertz(Windows)

1.首先安装命令行工具hz

image.png

2.创建新文件夹hertz_demo,进入文件夹后创建main.go文件,并添加以下代码

package main
​
import (
    "context"
​
    "github.com/cloudwego/hertz/pkg/app"
    "github.com/cloudwego/hertz/pkg/app/server"
    "github.com/cloudwego/hertz/pkg/common/utils"
    "github.com/cloudwego/hertz/pkg/protocol/consts"
)
​
func main() {
    h := server.Default()
​
    h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
            ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
    })
​
    h.Spin()
}

3.生成mod文件、整理&拉取依赖(直接在项目终端执行)

go mod init hertz_demo
go mod tidy

image.png

4.运行示例代码

$ go build -o hertz_demo && ./hertz_demo

推荐做法

在GOPATH/src目录下创建项目

1.进入目录终端,直接使用hz new命令

2.整理&拉取依赖

go mod tidy

image.png

只需两步即可体验hertz框架(非常简单)

3.运行测试

在Goland中的终端会失败,但是在cmd中就能成功

image.png

在PS时输入cmd即可进入传统cmd模式,即可测试成功

image.png

对接口进行测试

curl http://127.0.0.1:8888/ping

不出意外可以得到以下输出

image.png 到现在,我们已经成功启动了 Hertz Server,并完成了一次调用

PS和cmd的区别

1、在PS中,继承了cmd管道符号的表示方法:1表示管道。 2、PS与cmd的管道有本质的区别,cmd中的管道传递的是文本信息,而PS中传递的是对象,因此PS中的管道更加易于使用。

Hertz的优势:

字节跳动开源 Go HTTP 框架 Hertz 设计实践 | CloudWeGo