// Package define ... // // Description : 自定义请求context // // Author : go_developer@163.com<白茶清欢> // // Date : 2024-11-11 17:17 package define import ( "context" httpclientDefine "git.zhangdeman.cn/gateway/httpclient/define" validatorDefine "git.zhangdeman.cn/gateway/validator/define" "git.zhangdeman.cn/zhangdeman/trace" "sync" ) // 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 gatewayUrlConfig *ApiConfig // 网关接口的配置 requestInfo *RequestInfo // 网关请求信息 backendApiResultTable map[string]*httpclientDefine.Response // 后端接口返回数据详细信息: 接口别名 => 请求结果 pluginResultTable map[string][]*PluginResult // 插件执行结果记录 } // 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) } 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 }