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 接口
| /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 接口
| /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服务 │ │ 搜索引擎 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
协作流程:
四、技术特点对比
| 数据源 | 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协同工作,构成完整的数据处理链条,具有高并发、可扩展、多数据源支持等技术特点,适用于复杂业务规则执行和大数据分析场景。平台采用微服务架构,支持多实例部署和负载均衡。
