项目数据
约 1922 字大约 6 分钟
2025-04-29
前置说明
每个注册到网关的服务, 我们称之为项目
, 后续提到的项目, 即代指注册到网关的服务
项目信息
属性 | 字段名 | 类型 | 含义 |
---|---|---|---|
项目ID | id | bigint unsigned | 项目的ID |
项目标识 | flag | varchar(128) | 项目的标识,全局唯一 |
请求协议 | scheme_id | bigint unsigned | 请求协议ID, 请求协议作为配置独立维护, 此处引用ID |
项目域名 | domain | varchar(256) | 项目的域名,必须保证是个可访问域名 |
项目端口 | port | int unsigned | 项目的访问端口 |
连接超时时间 | connect_timeout | int unsigned | 连接服务的超时时间 |
读取超时时间 | read_timeout | int unsigned | 读取的超时时间 |
业务状态码字段 | code_field | varchar(32) | 业务状态码字段,用于判断业务处理是否成功 |
业务状态码字段位置 | code_field_location | varchar(32) | 业务状态码字段位置, 仅支持: HEADER/COOKIE/BODY , 可用的参见:可用的业务状态码字段位置 |
成功的业务状态码 | success_code | varchar(64) | 代表业务处理成功的状态码, 可以配置多个, 多个用 , 分隔 |
业务状态码描述的字段 | message_field | varchar(64) | 用于描述当前状态码的状态 |
业务数据字段 | data_field | varchar(64) | 业务返回数据字段, __body__ 是一个特殊配置,详见说明 |
唯一索引存在两个:
项目标识
: 项目标识全局唯一, 用于标记一个项目scheme_id + domain + port
: 项目域名+端口全局唯一, 用于代表同一个服务的域名(即: 协议://域名:端口)
业务数据字段说明
当业务数据字段为 __body__
时, 程序会将整个body全部作为响应数据, 一般 restful 接口返回数据时, 会将整个body作为响应数据, 此时可以将业务数据字段设置为 __body__
超时信息说明
golang的http请求是无法独立设置连接超时与读取超时的, 实际请求中, 会使用 connect_timeout + read_timeout
作为整体超时时间, 拆分成两段配置, 是为了明确提示, 一个人口请求是包含了服务连接时间的, 当服务端记录的处理时长与客户端记录的请求时长差距较大时, 可以考虑是否是连接时间过长
项目接口信息
属性 | 字段名 | 类型 | 含义 |
---|---|---|---|
接口ID | id | bigint unsigned | 接口的ID |
项目ID | project_id | bigint unsigned | 所属项目的ID |
接口路由 | uri | varchar(256) | 接口路由, 必须保证是个可访问路由 |
请求方法 | method_id | bigint unsigned | 请求方法的ID,请求方法视作配置,独立维护,此处通过ID进行引用 |
请求类型 | content_type_id | bigint unsigned | 请求网关接口的Content-Type的ID,视作配置,独立维护,此处通过ID进行引用 |
读取超时时间 | read_timeout | int unsigned | 读取的超时时间 |
唯一索引为: project_id + uri + method_id
, 项目 + 项目接口地址 + 项目接口请求方法, 定位唯一项目接口
关于超时时间的说明
- 超时时间(
read_timeout
)发现在项目接口维度
与项目维度
都存在, 当项目接口维度存在时, 会使用项目接口维度的超时时间, 当项目接口维度不存在时, 会使用项目维度的超时时间, 当项目接口维度与项目维度都不存在时, 会使用默认的超时时间 - 可以这么理解这两个超时时间: 项目维度是项目全全局默认值, 是一个保守数据, 正常情况下可以满足全部接口处理时长. 项目接口维度是针对每个独立的接口更
精细化
配置超时时间,控制接口处理时长. - 实际使用过程中,超时时间选取优先级顺序如下:
项目接口维度超时 > 项目维度超时 > 系统内置默认值
项目接口参数信息
属性 | 字段名 | 类型 | 含义 |
---|---|---|---|
参数ID | id | bigint unsigned | 参数的ID |
项目ID | project_id | bigint unsigned | 参数所属项目ID |
项目接口ID | project_api_id | bigint unsigned | 参数所属项目接口ID |
参数名称 | name | varchar(256) | 参数名称 |
参数类型 | param_type | varchar(32) | 参数类型,如string,number,boolean,array,object,支持的类型参见:支持的参数类型 |
参数位置 | location | varchar(32) | 参数在请求数据中的位置,如body,header,query,path,form, 支持的参数位置参见: 支持的参数位置 |
参数默认值 | default_value | varchar(1024) | 非必传参数 在未传, 或者传了对应类型零值 的情况下,会使用默认值给参数赋值, 关于不同类型的默认零值的信息,参见: 获取指定类型默认值 |
唯一索引: project_api_id + name + location
, 项目接口 + 参数名称 + 参数位置, 定位唯一项目接口参数
项目接口返回值信息
属性 | 字段名 | 类型 | 含义 |
---|---|---|---|
返回值ID | id | bigint unsigned | 返回值的ID |
项目ID | project_id | bigint unsigned | 参数所属项目ID |
项目接口ID | project_api_id | bigint unsigned | 参数所属项目接口ID |
返回值路径 | data_path | varchar(256) | 返回值在响应数据中的路径 |
返回值类型 | data_type | varchar(32) | 返回值的类型,如string,number,boolean,array,object,支持的类型参见:支持的返回值类型 |
返回值位置 | data_location | varchar(32) | 返回值在响应数据中的位置,支持的返回值位置参见: 支持的返回值位置 |
返回值默认值 | default_value | varchar(1024) | 返回值字段不存在时,以当前值返回 |
唯一索引: project_api_id + data_path + data_location
, 项目接口 + 返回值路径 + 返回值位置, 定位唯一项目接口返回值
返回值默认值说明
注意: 返回值默认值当且仅当返回值不存在,或者返回值为nil时生效
数据结构
前置说明
发起请求时,是没有项目概念的,只有一个个离散的接口,所以在核心流程中是不需要项目信息的
// ProjectApi 项目接口数据结构
type ProjectApi struct {
ProjectFlag string `json:"project_flag" dc:"项目标识"`
ProjectID int64 `json:"project_id" dc:"项目ID"`
FullUrl string `json:"full_url" dc:"请求的完整地址"`
ConnectTimeout int `json:"connect_timeout" dc:"连接超时时间"`
ReadTimeout int `json:"read_timeout" dc:"读取超时时间"`
CodeField string `json:"code_field" dc:"业务状态码字段"`
CodeFieldLocation string `json:"code_field_location" dc:"业务状态码位置"`
SuccessCode string `json:"success_code" dc:"成功的状态码"`
MessageField string `json:"message_field" dc:"业务状态码描述字段"`
DataField string `json:"data_data" dc:"业务数据字段"`
Body map[string]any `json:"body" dc:"请求的body"`
Query map[string]any `json:"query" dc:"请求的query"`
Header map[string]any `json:"header" dc:"请求的header"`
Cookie map[sting]any `json:"cookie" dc:"请求的cookie"`
}
// ProjectApiParam 项目接口参数
type ProjectApiParam struct {
ID int64 `json:"id" dc:"参数ID"`
ProjectID int64 `json:"project_id" dc:"项目ID"`
ProjectApiID int64 `json:"project_api_id" dc:"项目接口ID"`
Name string `json:"name" dc:"参数名称"`
ParamType string `json:"param_type" dc:"参数类型"`
Location string `json:"location" dc:"参数位置"`
}
// ProjectApiResult 网关接口返回值
type ProjectApiResult struct {
ID int64 `json:"id" dc:"返回值ID"`
ProjectID int64 `json:"project_id" dc:"项目ID"`
ProjectApiID int64 `json:"project_api_id" dc:"项目接口ID"`
DataPath string `json:"data_path" dc:"返回值路径"`
DataType string `json:"data_type" dc:"返回值类型"`
DataLocation string `json:"data_location" dc:"返回值位置"`
}
关于参数与返回值的说明
在上述数据结构定义中, ProjectApi中并没有直接引用参数与返回值的数据结构,好像配置没关联起来一样, 这个在下一节会做详细说明