237 lines
9.6 KiB
Go
237 lines
9.6 KiB
Go
// 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"
|
|
)
|
|
|
|
// 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 {
|
|
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
|
|
}
|
|
|
|
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 网关接口配置
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 10:41 2024/11/13
|
|
type ApiConfig struct {
|
|
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"` // 返回值类型
|
|
}
|
|
|
|
// RequestGroupItem 请求接口配置
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// 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"` // 服务接口配置
|
|
}
|
|
|
|
// RequestRewriteItem 请求转换规则配置
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// 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"` // 目标接口的参数路径
|
|
}
|
|
|
|
// Result 网关响应信息表
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// 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"` // 网关输出数据类型
|
|
}
|
|
|
|
// 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"` // 校验规则
|
|
}
|
|
|
|
// ServiceApiConfig 服务接口配置
|
|
//
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
//
|
|
// Date : 17:44 2024/5/13
|
|
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
|
|
}
|