请求转发与重写
约 1516 字大约 5 分钟
2025-04-29
前两节讲解了网关对外暴露接口的数据结构
以及后端服务的数据结构
, 但是相关数据结构是彼此孤立
的数据实体, 并未经理关联关系, 因此, 需要一套规则
将这些孤立的数据实体关联起来, 这套规则即为请求重写规则
。
请求分组
前面已经说到, 一个网关接口, 可以对应多个后端服务接口, 因此, 需要一个请求分组表
来记录这些后端服务接口的关联关系。
属性 | 字段名 | 类型 | 含义 |
---|---|---|---|
请求ID | id | bigint unsigned | 请求ID |
分组名称 | gateway_api_id | bigint unsigned | 网关接口ID |
项目ID | project_id | bigint unsigned | 关联项目ID |
项目接口ID | project_api_id | bigint unsigned | 关联项目接口ID |
项目接口别名 | project_api_alias | varchar(256) | 关联项目接口别名 |
请求顺序 | sort | int unsigned | 请求顺序 |
唯一索引为: gateway_api_id + project_api_alias
, 用于保证同一个网关接口下, 同一个项目接口别名只能存在一条记录。
关于sort(请求顺序)的说明
- 请求顺序, 用于确定请求分组表中后端服务接口的请求顺序, 当网关接收到请求后, 会按照请求顺序, 依次请求后端服务接口。
- 请求顺序, 越小, 优先级越高。
- 请求顺序相同, 则认为相关请求为同一组, 会并发进行请求。
- 请求顺序不同, 则认为相关请求为不同组, 会串行进行请求。
- 若某A接口依赖B接口的返回值作为参数,则A接口的请求顺序必须在B接口之后。
关于project_api_alias(项目接口别名)的说明
- 为什么会有项目接口别名: 正常而言, 一个网关接口之下, 对同一个项目接口只会发起一调用, 但是在某些场景下, 可能会需要对同一个项目接口发起多次调用, 因此, 需要一个
项目接口别名
来标识后端服务接口, 用于区分对同一个接口的多次调用。 - 项目接口别名, 用于标识后端服务接口的别名, 用于在网关接口中引用后端服务接口。
- 项目接口别名, 必须保证
同一个网关接口下唯一
。
请求重写规则
请求分组已经将网关接口与项目接口建立链接, 在此基础之上, 请求重写规则表则是一步步将网关接口的请求转换为项目接口的请求.
属性 | 字段名 | 类型 | 含义 |
---|---|---|---|
网关接口ID | gateway_api_id | bigint unsigned | 网关接口ID |
数据源接口别名ID | source_project_api_alias_id | bigint unsigned | 数据源接口别名ID,即为请求分组的主键ID , 指向一个项目接口 |
数据源接口返回值ID | source_project_api_result_id | bigint unsigned | 即为上一节提到的项目接口返回值的ID , 指向一个项目接口返回值 |
目标项目接口别名ID | target_project_api_alias_id | bigint unsigned | 目标接口别名ID,即为请求分组的主键ID , 指向一个项目接口 |
目标项目接口参数ID | target_project_api_param_id | bigint unsigned | 即为上一节提到的项目接口参数的ID , 指向一个项目接口参数 |
唯一索引为: target_project_api_alias_id + target_project_api_param_id
, 用于保证同一个目标项目接口下, 同一个参数只允许有一条获取规则。
重要!!! 关于请求重写规则的说明
source_project_api_alias_id
与 target_project_api_alias_id
均指向一个具体的项目接口, 那么如何从网关请求中获取参数呢? 此处做了如下约定:
source_project_api_alias_id
指向的项目接口, 即为数据源接口, 如果source_project_api_alias_id = 0, 则代表从网关请求获取数据
。source_project_api_alias_id = 0
时,source_project_api_result_id
则指向网关接口参数
即gateway_api_param
, 而非指向一个项目接口返回值。
响应重写规则
响应重写规则表, 则是将项目接口的响应转换为网关接口的响应。
属性 | 字段名 | 类型 | 含义 |
---|---|---|---|
网关接口ID | gateway_api_id | bigint unsigned | 网关接口ID |
数据源接口别名ID | source_project_api_alias_id | bigint unsigned | 数据源接口别名ID,即为请求分组的主键ID , 指向一个项目接口 |
数据源接口返回值ID | source_project_api_result_id | bigint unsigned | 即为上一节提到的项目接口返回值的ID , 指向一个项目接口返回值 |
网关接口返回值ID | gateway_api_result_id | bigint unsigned | 网关接口返回值ID |
唯一索引为: gateway_api_id + gateway_api_result_id
, 用于保证同一个网关接口下, 同一个返回值只允许有一条响应规则。
数据结构
// RequestGroup 请求分组
type RequestGroup struct {
ID int64 `json:"id" dc:"接口别名ID"`
GatewayApiID int64 `json:"gateway_api_id" dc:"网关接口ID"`
ProjectID int64 `json:"project_id" dc:"项目ID"`
ProjectApiID int64 `json:"project_api_id" dc:"项目接口ID"`
ProjectApiAlias string `json:"project_api_alias" dc:"项目接口别名"`
Sort int `json:"sort" dc:"请求顺序"`
}
// RequestRewrite 请求重写规则
type RequestRewrite struct {
GatewayApiID int64 `json:"gateway_api_id" dc:"网关接口ID"`
SourceProjectApiAliasID int64 `json:"source_project_api_alias_id" dc:"数据源接口别名ID"`
SourceProjectApiResultID int64 `json:"source_project_api_result_id" dc:"数据源接口返回值ID"`
TargetProjectApiAliasID int64 `json:"target_project_api_alias_id" dc:"目标接口别名ID"`
TargetProjectApiParamID int64 `json:"target_project_api_param_id" dc:"目标接口参数ID"`
}
// ResponseRewrite 响应重写规则
type ResponseRewrite struct {
GatewayApiID int64 `json:"gateway_api_id" dc:"网关接口ID"`
SourceProjectApiAliasID int64 `json:"source_project_api_alias_id" dc:"数据源接口别名ID"`
SourceProjectApiResultID int64 `json:"source_project_api_result_id" dc:"数据源接口返回值ID"`
GatewayApiResultID int64 `json:"gateway_api_result_id" dc:"网关接口返回值ID"`
}
总结
请求分组: 定义了网关接口与项目接口的关联关系, 网关接口请求, 后续会转换为对这一系列项目接口的请求。 请求重写规则: 定义了网关接口请求与项目接口请求的转换规则, 用于构建项目接口的请求参数。 响应重写规则: 定义了项目接口响应与网关接口响应的转换规则, 用于通过项目接口返回值构建网关接口的响应数据。