欢迎光临
我们一直在努力

goweb3系列解析24: goweb3water数据引擎与计算专家

https://gitee.com/leijmdas/goweb3water.git

 

GOWEB3 数据引擎与计算专家

项目概述

GOWEB3 是一个基于 Go 语言构建的规则引擎与数据计算平台,核心定位是提供灵活、高效的业务规则执行能力。该项目采用了 bilibili/gengine 作为规则引擎核心,支持复杂业务规则的配置化执行。


架构设计

核心架构层次

┌─────────────────────────────────────────────────────────────┐
│ API 层 (ruleserver) │
│ – RuleFuncService: 规则执行接口 │
│ – /engine: 单条规则执行 │
│ – /batch: 批量规则执行 │
├─────────────────────────────────────────────────────────────┤
│ 引擎层 (ruleapi/engine) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ RuleEngine │ │ RuleCtx │ │ RuleParams │ │
│ │ 规则执行引擎 │ │ 执行上下文 │ │ 参数聚合对象 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 函数层 (ruleapi/engine/rulefacade) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ FuncCore │ │ FuncDomain │ │ FuncFacade │ │
│ │ 基础函数集 │ │ 业务扩展函数 │ │ 函数门面 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 数据源层 │
│ – MySQL / PostgreSQL / ClickHouse │
│ – Elasticsearch │
└─────────────────────────────────────────────────────────────┘


核心组件解析

1. RuleEngine(规则引擎)

位置: ruleapi/engine/rulecore/rule_engine.go

go

// 核心执行流程
func (self *RuleEngine) DoRule(ruleData *ruledata.RuleData) (*rulectx.RuleCtx, error) {
ruleData.ToRule()
if ruleData.Param != nil {
self.In.Data = ruleData.Param
}
ruleCtx, err := self.iDoRule(ruleData.Rule, self.In)
if err == nil {
ruleData.Result = ruleCtx.Out.Data
}
return ruleCtx, err
}

核心能力:

  • 规则解析与编译
  • 规则校验(语法检查)
  • 支持并发执行模式

2. RuleCtx(执行上下文)

位置: ruleapi/engine/rulecore/rulectx/rule_ctx.go

go

type RuleCtx struct {
*context.DataContext // Gengine上下文
In *ruleparam.RuleParams // 输入参数
Out *ruleparam.RuleParams // 输出参数
}

职责:

  • 管理规则执行的输入/输出数据
  • 提供上下文函数(SetReturnValue、GetParam等)
  • 聚合所有可调用函数到DataContext

3. FuncFacade(函数门面)

位置: ruleapi/engine/rulefacade/func_facade.go

职责:

  • 统一管理核心函数(FuncCore)和业务扩展函数(FuncDomain)
  • 支持函数的动态注册与调用
  • 提供函数列表查询能力

4. GeneralFuncs(通用函数集)

位置: ruleapi/engine/rulefacade/funcdomain/general/general_funcs.go

支持的函数:

函数名功能描述
SnowflakeNextId() 生成雪花ID
ListFuncs() 获取所有注册函数列表
EsQuery() Elasticsearch查询
EsGetMapping() 获取ES映射信息
Any2Str() 任意类型转字符串

API 接口

规则执行接口

POST /engine

json

{
"Rule": ["rule \\"pay-calc-001\\" \\"工资计算规则\\" salience 0",
"when",
" In.GetInt(\\"baseSalary\\") > 10000",
"then",
" Out.SetParam(\\"bonus\\", In.GetInt(\\"baseSalary\\") * 0.1);"],
"Param": {
"baseSalary": 15000,
"workDays": 22
}
}

响应:

 

json

{
"Code": 200,
"Message": "success",
"Data": {
"bonus": 1500
}
}

批量执行接口

POST /batch

支持一次提交多条规则数据进行批量处理。


规则语法

基于 Gengine 规则语法,支持:

rule "规则ID" "规则名称" salience 优先级
when
条件表达式(支持 ==, !=, >, <, >=, <=, &&, ||, !)
then
执行动作(函数调用、参数设置)

支持的运算:

  • 四则运算:+, -, *, /
  • 逻辑运算:&&, ||, !
  • 比较运算:==, !=, >, <, >=, <=
  • 赋值运算:+=, -=, *=, /=

项目结构


技术特点

特性说明
声明式规则 通过配置文件定义业务规则,无需修改代码
热加载 规则可动态加载,无需重启服务
高并发 支持规则引擎池化,并发执行
可扩展 通过FuncDomain机制扩展业务函数
多数据源 支持MySQL、PostgreSQL、ClickHouse、ES
API优先 提供RESTful API,易于集成

应用场景

  • 政策引擎:金融、保险领域的政策规则配置
  • 业务编排:复杂业务流程的规则化配置
  • 数据计算:批量数据的规则驱动计算
  • 决策系统:基于规则的智能决策支持
  •  

    GOWEB3 数据引擎 – dbserver 与 esserver

    整体架构

    ┌─────────────────────────────────────────────────────────────────┐
    │ GOWEB3 数据引擎平台 │
    ├─────────────────────────────────────────────────────────────────┤
    │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
    │ │ dbserver │ │ esserver │ │ ruleserver │ │
    │ │ 数据库服务 │ │ Elastic服务 │ │ 规则引擎服务 │ │
    │ └──────────────┘ └──────────────┘ └──────────────┘ │
    │ │ │ │ │
    │ ▼ ▼ ▼ │
    │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
    │ │ MySQL/PG/CK │ │ Elasticsearch│ │ RuleEngine │ │
    │ └──────────────┘ └──────────────┘ └──────────────┘ │
    └─────────────────────────────────────────────────────────────────┘


    一、dbserver – 数据库服务

    1.1 核心定位

    dbserver 是一个通用的数据库访问服务,提供统一的 RESTful API 接口来访问多种数据库(MySQL、PostgreSQL、ClickHouse),实现数据库操作的标准化和规范化。

    1.2 项目结构

    dbserver/
    ├── cmd/dbserver/ # 命令行入口
    │ └── main.go
    ├── server/ # HTTP服务
    │ ├── main.go
    │ ├── router/ # 路由注册
    │ ├── service/ # API服务
    │ │ ├── all/ # 通用服务
    │ │ ├── cache/ # 缓存服务
    │ │ └── db/ # 数据库服务
    │ └── webstart/ # Web启动
    ├── config/ # 配置文件
    │ ├── ichub-mysql.yml
    │ ├── ichub-postgres.yml
    │ └── ichub-clickhouse.yml
    └── docker/ # Docker配置

    1.3 核心 API 接口

    API 路径方法功能描述
    /query POST 数据库分页查询
    /cmd POST 执行SQL命令
    /meta POST 获取数据库元数据
    /generalquery GET 通用表扫描

    1.4 核心服务实现

    DbqueryFuncService (server/service/db/db_func_service.go)

    go

    type DbqueryFuncService struct {
    funchandler.FuncService
    }

    func (this *DbqueryFuncService) init() *DbqueryFuncService {
    this.InitRouter(this, consts.GROUP_PATH_WEBSITE)
    this.RegisterRouter(http.MethodPost, "/query", this.ExecuteQuery)
    this.RegisterRouter(http.MethodPost, "/cmd", this.ExecuteCmd)
    this.RegisterRouter(http.MethodPost, "/meta", this.ExecuteMeta)
    this.RegisterRouter(http.MethodGet, "/generalquery", this.ExecuteScanTable)
    return this
    }

    1.5 支持的数据库类型

    数据库配置文件驱动
    MySQL ichub-mysql.yml github.com/go-sql-driver/mysql
    PostgreSQL ichub-postgres.yml github.com/lib/pq
    ClickHouse ichub-clickhouse.yml github.com/ClickHouse/clickhouse-go

    1.6 API 使用示例

    POST /query

    json

    {
    "DbType": "mysql",
    "TableName": "users",
    "PageIndex": 1,
    "PageSize": 10,
    "Where": "age > 18",
    "OrderBy": "create_time DESC"
    }

    响应:

    json

    {
    "Code": 200,
    "Message": "success",
    "Data": {
    "Total": 1000,
    "List": […],
    "PageIndex": 1,
    "PageSize": 10
    }
    }


    二、esserver – Elasticsearch 服务

    2.1 核心定位

    esserver 是一个专门为 Elasticsearch 提供统一访问接口的服务,封装了 ES 的查询、元数据、分词等核心能力,提供标准化的 RESTful API。

    2.2 项目结构

    esserver/
    ├── cmd/esserver/ # 命令行入口
    ├── server/ # HTTP服务
    │ ├── main.go
    │ ├── router/ # 路由注册
    │ ├── service/ # API服务
    │ │ ├── all/ # 通用服务
    │ │ ├── cache/ # 缓存服务
    │ │ └── elastic/ # ES核心服务
    │ │ ├── QueryFuncService.go # 查询服务
    │ │ ├── MetadataFuncService.go # 元数据服务
    │ │ ├── KeywordFuncService.go # 分词服务
    │ │ └── CmdFuncService.go # 命令服务
    │ └── webstart/ # Web启动
    └── domain/ # 领域模型
    ├── es/ # ES实体定义
    └── db/ # 数据库实体

    2.3 核心 API 接口

    API 路径方法功能描述服务类
    /query POST ES分页查询 EsQueryFuncService
    /meta POST ES元数据(mapping等) EsMetadataFuncService
    /keyword POST ES分词分析 EsKeywordFuncService
    /cmd POST ES命令执行 EsCmdFuncService

    2.4 核心服务详解

    2.4.1 查询服务 – EsQueryFuncService

    go

    func (self *EsQueryFuncService) ExeFunc(ctx *gin.Context) (any, error) {
    var q = pagerequest.Default()
    if err := self.ParseBody(ctx, q); err != nil {
    return nil, err
    }

    if len(q.IndexName) == 0 {
    return nil, basedto.NewIchubError(500, "indexName is Empty!")
    }

    return q.Execute()
    }

    功能特点:

    • 支持多种查询类型:match、term、range、bool等
    • 分页支持
    • 查询耗时统计

    2.4.2 元数据服务 – EsMetadataFuncService

    go

    func (this *EsMetadataFuncService) ExeFunc(ctx *gin.Context) (any, error) {
    var metadataRequest = pagerequest.NewMetadataRequest()
    // 解析请求并执行元数据查询
    return metadataRequest.Execute()
    }

    功能特点:

    • 获取索引 mapping
    • 获取索引设置
    • 获取索引统计信息

    2.4.3 分词服务 – EsKeywordFuncService

    go

    func (this *EsKeywordFuncService) ExeFunc(ctx *gin.Context) (any, error) {
    var keyWorkRequest = pagerequest.NewKeyworkRequest()
    // 执行分词分析
    return keyWorkRequest.Analyze()
    }

    功能特点:

    • 支持自定义分词器
    • 支持多种语言分词
    • 返回分词结果详情

    2.4.4 命令服务 – EsCmdFuncService

    go

    func (this *EsCmdFuncService) ExeFunc(ctx *gin.Context) (any, error) {
    var cmdRequest = pagerequest.NewCmdRequest()
    return cmdRequest.Execute()
    }

    功能特点:

    • 支持 ES DSL 查询
    • 支持索引创建/删除
    • 支持数据批量操作

    2.5 API 使用示例

    POST /query

    json

    {
    "IndexName": "user_logs",
    "PageIndex": 1,
    "PageSize": 20,
    "Query": {
    "bool": {
    "must": [
    {"term": {"user_id": "12345"}},
    {"range": {"log_time": {"gte": "2024-01-01"}}}
    ]
    }
    },
    "Sort": ["log_time DESC"]
    }

    POST /keyword

    json

    {
    "IndexName": "articles",
    "Text": "我是中国人",
    "Analyzer": "ik_max_word"
    }

    响应:

    json

    {
    "Code": 200,
    "Message": "success",
    "Data": {
    "tokens": ["我", "是", "中国", "中国人", "人"]
    }
    }


    三、服务协作关系

     
    ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
    │ ruleserver │──────▶│ dbserver │──────▶│ MySQL/PG/CK │
    │ 规则引擎 │ │ 数据库服务 │ │ 关系型数据库 │
    └─────────────────┘ └─────────────────┘ └─────────────────┘
    │ │
    │ │
    ▼ ▼
    ┌─────────────────┐ ┌─────────────────┐
    │ ruleserver │──────▶│ esserver │──────▶│ Elasticsearch │
    │ 规则引擎 │ │ ES服务 │ │ 搜索引擎 │
    └─────────────────┘ └─────────────────┘ └─────────────────┘

    协作流程:

  • ruleserver 通过规则调用 dbserver 进行数据查询
  • ruleserver 通过规则调用 esserver 进行全文检索
  • dbserver 和 esserver 也可独立对外提供服务

  • 四、技术特点对比

    特性dbserveresserver
    数据源 MySQL/PG/ClickHouse Elasticsearch
    查询方式 SQL DSL/REST
    数据类型 结构化数据 非结构化/半结构化
    主要用途 事务处理、报表统计 全文搜索、日志分析
    索引类型 B+树索引 倒排索引
    一致性 强一致性 最终一致性
    扩展性 垂直扩展为主 水平扩展

    五、部署架构

     
    ┌─────────────────┐
    │ Nginx │
    │ 负载均衡 │
    └────────┬────────┘

    ┌──────────────────────────┼──────────────────────────┐
    │ │ │
    ▼ ▼ ▼
    ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
    │ dbserver │ │ esserver │ │ ruleserver │
    │ (多实例) │ │ (多实例) │ │ (多实例) │
    └───────┬───────┘ └───────┬───────┘ └───────┬───────┘
    │ │ │
    ▼ ▼ │
    ┌───────────────┐ ┌───────────────┐ │
    │ MySQL/PG │ │ Elasticsearch│◄────────────────┘
    │ ClickHouse │ │ Cluster │
    └───────────────┘ └───────────────┘


    六、总结

    服务定位核心能力适用场景
    dbserver 数据库统一访问层 SQL查询、元数据、DDL 业务数据管理、报表统计
    esserver ES统一访问层 全文搜索、分词、聚合 日志分析、全文检索
    ruleserver 规则引擎服务 规则执行、业务编排 政策引擎、决策系统

    这三个服务共同构成了 GOWEB3 数据引擎平台的核心能力:

    • 数据存储:通过 dbserver 访问关系型数据库
    • 数据检索:通过 esserver 进行全文搜索
    • 业务编排:通过 ruleserver 实现规则驱动的业务逻辑

     

           goweb3water是一个基于Go语言构建的分布式数据计算平台,包含ruleserver规则引擎、dbserver数据库服务和esserver搜索服务三大核心组件。ruleserver采用bilibili/gengine作为规则引擎核心,提供多级架构(API层、引擎层、函数层、数据源层),支持声明式规则配置和热加载,适用于金融政策、业务编排等场景。dbserver统一封装MySQL/PostgreSQL/ClickHouse操作,提供RESTful API接口;esserver则专注Elasticsearch服务,实现查询、修改、元数据管理和分词功能。三大服务通过标准化API协同工作,构成完整的数据处理链条,具有高并发、可扩展、多数据源支持等技术特点,适用于复杂业务规则执行和大数据分析场景。平台采用微服务架构,支持多实例部署和负载均衡。

     

    赞(0)
    未经允许不得转载:171主机测评 » goweb3系列解析24: goweb3water数据引擎与计算专家
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址