core/define/context.go

237 lines
9.6 KiB
Go
Raw Permalink Normal View History

// Package define ...
//
// Description : 自定义请求context
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2024-11-11 17:17
package define
import (
"context"
validatorDefine "git.zhangdeman.cn/gateway/validator/define"
"git.zhangdeman.cn/zhangdeman/trace"
"sync"
)
2024-11-20 15:49:31 +08:00
// NewRequestContext 获取context实例
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:44 2024/11/20
func NewRequestContext(ctx context.Context, traceID string) *RequestContext {
if nil == ctx {
ctx = context.Background()
}
return &RequestContext{
ctx: ctx,
runtimeInstance: trace.NewRuntime(traceID, 1),
lock: &sync.RWMutex{},
traceID: traceID,
pluginResultTable: make(map[string][]*PluginResult),
data: make(map[string]any),
}
}
// RequestContext 请求配置
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:19 2024/11/11
type RequestContext struct {
2024-11-20 15:49:31 +08:00
ctx context.Context // ctx 上下文
runtimeInstance *trace.Runtime // 链路统一追踪实例
lock *sync.RWMutex // 数据锁
traceID string // 全链路追踪的trace_id
pluginResultTable map[string][]*PluginResult // 插件执行结果记录
data map[string]any // 自定义设置的数据
}
// SetPluginResult 设置插件执行结果
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:53 2024/11/13
func (rc *RequestContext) SetPluginResult(r *PluginResult) {
rc.Lock()
defer rc.Unlock()
// 一次请求中, 同一个插件可能多次执行
if v, exist := rc.pluginResultTable[r.ID]; !exist || nil == v {
rc.pluginResultTable[r.ID] = make([]*PluginResult, 0)
}
rc.pluginResultTable[r.ID] = append(rc.pluginResultTable[r.ID], r)
}
// TraceID 获取traceID
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:22 2024/11/13
func (rc *RequestContext) TraceID() string {
return rc.traceID
}
// Trace 追踪实例
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:24 2024/11/13
func (rc *RequestContext) Trace() *trace.Runtime {
return rc.runtimeInstance
}
2024-11-13 11:24:42 +08:00
func (rc *RequestContext) Lock() {
rc.lock.Lock()
}
func (rc *RequestContext) Unlock() {
rc.lock.Unlock()
}
func (rc *RequestContext) RLock() {
rc.lock.RLock()
}
func (rc *RequestContext) RUnlock() {
rc.lock.RUnlock()
}
// ApiConfig 网关接口配置
2024-11-13 11:24:42 +08:00
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:41 2024/11/13
type ApiConfig struct {
2024-11-13 11:24:42 +08:00
Uri string `json:"uri"` // 网关接口ID
ContentType string `json:"content_type"` // 请求类型
Method string `json:"method"` // 请求方法
Version string `json:"version"` // 接口版本
ParamList []*Param `json:"param_list"` // 参数列表
ResultList []*Result `json:"result_list"` // 返回值列表
ServiceApiTable map[string]*ServiceApiConfig `json:"service_api_table"` // 服务接口列表
RequestGroup [][]*RequestGroupItem `json:"request_group"` // 请求分组
RequestRewriteTable map[string][]*RequestRewriteItem `json:"request_rewrite_table"` // 请求重写规则, 项目接口别名ID => 重写规则列表
}
// GatewayApiDetailProjectApiParamItem 项目接口参数
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:51 2024/5/13
type GatewayApiDetailProjectApiParamItem struct {
ID int64 `json:"id"` // 参数ID
Location string `json:"location"` // 参数位置
Name string `json:"name"` // 参数名称
ParamType string `json:"param_type"` // 参数类型
DefaultValue string `json:"default_value"` // 默认值
}
// GatewayApiDetailProjectApiResultItem 项目接口返回值
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:51 2024/5/13
type GatewayApiDetailProjectApiResultItem struct {
ID int64 `json:"id"` // 返回值ID
Location string `json:"location"` // 返回值位置
Path string `json:"path"` // 返回值路径
ResultType string `json:"result_type"` // 返回值类型
}
2024-11-13 11:24:42 +08:00
// RequestGroupItem 请求接口配置
//
// Author : go_developer@163.com<白茶清欢>
//
2024-11-13 11:24:42 +08:00
// Date : 11:10 2024/11/13
type RequestGroupItem struct {
ServiceFlag string `json:"service_flag"` // 服务标识
ServiceApiFlag string `json:"service_api_flag"` // 服务接口标识
ServiceApiAlias string `json:"service_api_alias"` // 服务接口别名
ServiceApiConfig *ServiceApiConfig `json:"service_api_config"` // 服务接口配置
}
2024-11-13 11:24:42 +08:00
// RequestRewriteItem 请求转换规则配置
//
// Author : go_developer@163.com<白茶清欢>
//
2024-11-13 11:24:42 +08:00
// Date : 11:16 2024/11/13
type RequestRewriteItem struct {
SourceServiceApiAlias string `json:"source_service_api_alias"` // 数据源项目接口别名 __GATEWAY__ 代表从网关读取
SourceServiceApiResultLocation string `json:"source_service_api_result_location"` // 数据源接口返回值位置
SourceServiceApiResultPath string `json:"source_service_api_result_path"` // 数据源接口返回值路径, SourceServiceApiAlias = __GATEWAY__ 代表从网关读取
TargetServiceApiAlias string `json:"target_service_api_alias"` // 目标接口接口别名
TargetServiceApiParamLocation string `json:"target_service_api_param_location"` // 目标接口的参数位置
TargetServiceApiParamPath string `json:"target_service_api_param_path"` // 目标接口的参数路径
}
2024-11-13 11:24:42 +08:00
// Result 网关响应信息表
//
// Author : go_developer@163.com<白茶清欢>
//
2024-11-13 11:24:42 +08:00
// Date : 11:21 2024/11/13
type Result struct {
SourceProjectApiAlias string `json:"source_project_api_alias"` // 数据源项目接口别名 __GATEWAY__ 代表从网关读取
SourceDataLocation string `json:"source_data_location"` // 数据源数据位置
SourceDataPath string `json:"source_data_path"` // 数据源数据路径
SourceDataType string `json:"source_data_type"` // 数据源数据类型
OutputLocation string `json:"output_location"` // 网关输出位置
OutputPath string `json:"output_path"` // 网关输出路径
OutputDataType string `json:"output_data_type"` // 网关输出数据类型
}
2024-11-13 11:24:42 +08:00
// Param 网关接口参数数据结构
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 11:20 2024/11/13
type Param struct {
Location string `json:"location"` // 参数位置
Path string `json:"path"` // 参数路径
ParamType string `json:"param_type"` // 参数类型
DefaultValue string `json:"default_value"` // 默认值
IsRequired bool `json:"is_required"` // 是否必传
AllowEmpty bool `json:"allow_empty"` // 空字符串是否为有效参数
AllowZero bool `json:"allow_zero"` // 数字类型, 0 是否为有效参数
AllowNil bool `json:"allow_nil"` // nil 是否为有效参数
ValidateRule *validatorDefine.FieldRule `json:"validate_rule"` // 校验规则
}
2024-11-13 11:24:42 +08:00
// ServiceApiConfig 服务接口配置
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:44 2024/5/13
2024-11-13 11:24:42 +08:00
type ServiceApiConfig struct {
ServiceFlag string `json:"service_flag"` // 服务标识标识
ServiceApiFlag string `json:"service_api_flag"` // 服务接口标识
CacheEnable bool `json:"cache_enable"` // 缓存是否可用
CacheInstanceID int64 `json:"cache_instance_id"` // 缓存可用的情况下, 缓存实例ID
FullUrl string `json:"full_url"` // 项目接口完整Url
CodeField string `json:"code_field"` // 状态码字段
MessageField string `json:"message_field"` // 状态码描述字段
DataField string `json:"data_field"` // 数据字段
SuccessCodeList []string `json:"success_code_list"` // 成功状态码列表
Method string `json:"method"` // 请求方法
ContentType string `json:"content_type"` // 请求类型
ParamList []*GatewayApiDetailProjectApiParamItem `json:"param_list"` // 项目接口参数列表
ResultList []*GatewayApiDetailProjectApiResultItem `json:"result_list"` // 项目接口返回值列表
}
// RequestInfo ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:47 2024/11/13
type RequestInfo struct {
Header map[string]string `json:"header"` // header信息
Cookie map[string]string `json:"cookie"` // cookie信息
Query map[string]string `json:"query"` // cookie信息
Body map[string]any `json:"body"` // body信息
Method string `json:"method"` // 请求方法
Domain string `json:"domain"` // 域名
ContentType string `json:"content_type"` // 请求类型
Scheme string `json:"scheme"` // scheme
Uri string `json:"uri"` // 接口uri
}