Go运行Grule引擎实现计费规则管理

Go运行Grule引擎实现计费规则管理

  • github位置: https://github.com/hyperjumptech/grule-rule-engine
# 安装grule模块
go get -u github.com/hyperjumptech/grule-rule-engine

Grule的示例代码

  • 示例位置: https://github.com/hyperjumptech/grule-rule-engine/tree/master/examples
    • 使用 go test 运行
    cd examples
    $ go test NumberExponentExample_test.go 
    ok      command-line-arguments  0.011s
    
  • Grule规则
    • rule {} 表示规则
    • salience 10 表示优先级为10
      • 优先级高的先执行
type ExponentData struct {Check float64Set   float64
}/*条件部分 (when):当ExponentData 结构体中的 Check 等于 6.67428e-11 时,规则会触发动作部分 (then):当条件满足时,将 ExponentData 结构体中的 Set 设置为 .12345E+5然後,使用 Retract("ExponentCheck") 將這個规则從工作记忆中移除,以防止它再次被觸發。
*/const ExponentRule = `
rule  ExponentCheck  "User Related Rule"  salience 10 {when ExponentData.Check == 6.67428e-11ThenExponentData.Set = .12345E+5;Retract("ExponentCheck");
}
`
// 往下是 运行"github.com/stretchr/testify/assert"的测试代码, 忽略
func TestEvaluateAndAssignExponentNumber(t *testing.T) {exponent := &ExponentData{Check: 6.67428e-11,Set:   0,}...
}
  • 总结:Grule规则使用 when 判断条件, 当条件满足时执行 then

编写计费规则代码

  • 仿照示例代码,编写计费规则代码
    • 对云服务器 cpu 计费, 每小时 0.05元 * 核数
    • 对云服务器 内存 计费, 每小时 0.01元 * GB
    const (rule = `rule CalculateCost "Calculate the total cost based on CPU and Memory usage" {when CloudResource.CPU > 0 &&CloudResource.Memory > 0thencostPerCPUHour = 0.05;costPerGBMemoryHour = 0.01;cpuCost = CloudResource.CPU * costPerCPUHour;memoryCost = CloudResource.Memory * costPerGBMemoryHour;CloudResource.TotalCost = cpuCost + memoryCost;Retract("CalculateCost");}`
    )
    
    • cpu 内存 总费用 封装为结构体
    type CloudResource struct {CPU       float64Memory    float64TotalCost float64
    }
    
  • 使用 go test 执行完整代码
package exampleimport ("testing""github.com/hyperjumptech/grule-rule-engine/ast""github.com/hyperjumptech/grule-rule-engine/builder""github.com/hyperjumptech/grule-rule-engine/engine""github.com/hyperjumptech/grule-rule-engine/pkg""github.com/stretchr/testify/assert"
)const (rule = `
rule CalculateCost "Calculate the total cost based on CPU and Memory usage" {when CloudResource.CPU > 0 &&CloudResource.Memory > 0thencostPerCPUHour = 0.05;costPerGBMemoryHour = 0.01;cpuCost = CloudResource.CPU * costPerCPUHour;memoryCost = CloudResource.Memory * costPerGBMemoryHour;CloudResource.TotalCost = cpuCost + memoryCost;Retract("CalculateCost");
}
`
)type CloudResource struct {CPU       float64Memory    float64TotalCost float64
}func TestCloudResource(t *testing.T) {myResource := &CloudResource{CPU:    2,Memory: 4,}dataContext := ast.NewDataContext()err := dataContext.Add("CloudResource", myResource)if err != nil {t.Fatal(err)}lib := ast.NewKnowledgeLibrary()ruleBuilder := builder.NewRuleBuilder(lib)err = ruleBuilder.BuildRuleFromResource("Test", "0.1.1", pkg.NewBytesResource([]byte(rule)))assert.NoError(t, err)kb, err := lib.NewKnowledgeBaseInstance("Test", "0.1.1")assert.NoError(t, err)eng1 := &engine.GruleEngine{MaxCycle: 1}err = eng1.Execute(dataContext, kb)assert.NoError(t, err)// 檢查計算出的總成本expectedTotalCost := (2 * 0.05) + (4 * 0.01)assert.Equal(t, expectedTotalCost, myResource.TotalCost)
}
  • 总结: 使用 assert.Equal 校验 expectedTotalCost ,最后得出结果
$ go test
PASS
ok      grule_study/example/test        0.007s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业网站面临的爬虫攻击及安全防护策略

在当今数字化时代,企业网站不仅是展示企业形象的窗口,更是进行商业活动的重要平台。然而,企业网站在日常运营中面临着多种类型的爬虫攻击,这些攻击不仅会对网站的正常访问造成影响,还可能窃取敏感数据,给企…

Hive on Spark 的Pre-commit 测试

什么是 Pre-Commit 测试? Pre-Commit 测试是一种提交代码到主分支或共享代码库之前运行的一系列自动化测试,用于捕获代码中的潜在问题自动运行的测试流程。其目的是确保新提交的代码不会引入错误,破坏现有功能或降低代码质量。对于大型项目如…

android shader gl_Position是几个分量

在Android的OpenGL ES中,gl_Position是顶点着色器(Vertex Shader)的一个内置输出变量,它用于指定顶点在裁剪空间(Clip Space)中的位置。gl_Position是一个四维向量(4-component vector&#xff…

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(6)

1.问题描述: 推送通知到手机,怎么配置拉起应用指定的页面? 解决方案: 1、如果点击通知栏打开默认Ability的话, actionType可以设置为0, 同时可以在.clickAction.data中,指定待跳转的page页面…

vue3 + vite + antdv 项目中自定义图标

前言: 去iconfont-阿里巴巴矢量图标库 下载自己需要的icon图标,下载格式为svg;项目中在存放静态资源的文件夹下 assets 创建一个存放svg格式的图片的文件夹。 步骤: 1、安装vite-plugin-svg-icons npm i vite-plugin-svg-icons …

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是:当前操作系统版本为Windows Server 2016 Standard版本,其自带的Microsoft .NET Framework 版本为4.6太低,不满足要求。 根据报错的提示,点击链接…

学习笔记039——SpringBoot整合Redis

文章目录 1、Redis 基本操作Redis 默认有 16 个数据库,使用的是第 0 个,切换数据库添加数据/修改数据查询数据批量添加批量查询删除数据查询所有的 key清除当前数据库清除所有数据库查看 key 是否存在设置有效期查看有效期 2、Redis 数据类型String追加字…

基于yolov8、yolov5的铝材缺陷检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要:铝材缺陷检测在现代工业生产和质量管理中具有重要意义,不仅能帮助企业实时监控铝材质量,还为智能化生产系统提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的铝材缺陷检测模型,该模型使用了大量包含…

如何在 VPS 上使用 Git 设置自动部署

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 要了解 Git 的基本知识以及如何安装,请参考介绍教程。 本文将教你如何在部署应用程序时使用 Git。虽然有许多使用 Gi…

Goland或Idea启动报错

Goland或Idea启动不了 报错如图: 原因:破解导致 解决方案 环境变量中有关Goland的全部删除

ceph手动部署

ceph手动部署 一、 节点规划 主机名IP地址角色ceph01.example.com172.18.0.10/24mon、mgr、osd、mds、rgwceph02.example.com172.18.0.20/24mon、mgr、osd、mds、rgwceph03.example.com172.18.0.30/24mon、mgr、osd、mds、rgw 操作系统版本: Rocky Linux release …

C#基础之方法

文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…

Unity——Toggle的状态监听处理

文章目录 前言一、单个Toggle的事件监听二、多个Toggle的事件监听注意事项 前言 在Unity中,Toggle 是一种用户界面(UI)元素,通常用于提供一个开关选项,允许用户选择开启或关闭某个特定的功能。Toggle 组件有一个 onVa…

PMP–一、二、三模、冲刺–分类–8.质量管理

文章目录 技巧五、质量管理 一模8.质量管理--质量管理计划--质量管理计划包括项目采用的质量标准,到底有没有满足质量需求,看质量标准即可。6、 [单选] 自项目开始以来,作为项目经理同事的职能经理一直公开反对该项目,在讨论项目里…

LabVIEW实现UDP通信

目录 1、UDP通信原理 2、硬件环境部署 3、云端环境部署 4、UDP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 8、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利…

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程

在 Ubuntu 20.04 上使用 Lux 下载 Bilibili 视频的详细教程 在 Ubuntu 20.04 上使用 Lux 下载 Bilibili(哔哩哔哩)视频的完整和详细步骤如下,包括使用预编译二进制文件的安装方法: 1. 安装依赖 确保你的系统已安装 FFmpeg&…

C语言——库函数

常用的函数 https://cplusplus.com/reference/ 没事儿多看看 1 数学函数 #include <math.h> #include <stdio.h> int main() {printf("%lf\n", sqrt(4));//开平方根——>double类型printf("%lf\n", pow(2, 10));//求几次方的——>do…

纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架

前言​ 开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C 库&#xff0c;如 ​​OpenCV​​ 或 ​​​dlib​​​&#xff0c;但通过 ​​​cgo​​​ 调用 C 程序会引入巨大的延迟&#xff0c;并在性能方面产生显著的权衡。…

硬菜3道+馒头

硬菜3道 1、可乐鸡翅 》鸡翅滑刀酱油耗油胡椒粉盐》 搅拌腌制3-5分钟 》油锅&#xff0c;直到2面煎黄 》倒入可乐&#xff0c;到大火收汁&#xff0c;出锅 2、洋葱牛肉 》冻牛肉切薄酱油耗油胡椒粉盐 》手指摇匀 》加入生粉水&#xff0c;继续摇匀》直到粘稠 》油锅牛肉炒半熟&…

27 基于51单片机的方向盘模拟系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用两个MPX4115压力传感器作为两路压力到位开关电路&#xff0c; 采用滑动变阻器连接数模转换器模拟重力加速度传感器电路&#xff1b; 一个按键控制LED灯的点亮与…