增加插件接口及插件结果定义

This commit is contained in:
白茶清欢 2024-11-13 17:54:44 +08:00
parent 8022a8533f
commit 942cd1dfed
3 changed files with 78 additions and 7 deletions

View File

@ -21,13 +21,30 @@ import (
//
// Date : 17:19 2024/11/11
type RequestContext struct {
ctx context.Context `json:"-"` // gin 上下文
runtimeInstance *trace.Runtime `json:"-"` // 链路统一追踪实例
lock *sync.RWMutex `json:"-"` // 数据锁
TraceID string `json:"trace_id"` // 全链路追踪的trace_id
GatewayUrlConfig *ApiConfig `json:"gateway_url_config"` // 网关接口的配置
RequestInfo *RequestInfo `json:"request_info"` // 网关请求信息
BackendApiResultTable map[string]*httpclientDefine.Response `json:"backend_api_result_table"` // 后端接口返回数据详细信息: 接口别名 => 请求结果
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() {

24
define/plugin.go Normal file
View File

@ -0,0 +1,24 @@
// Package define ...
//
// Description : define ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2024-11-13 17:26
package define
// PluginResult 插件执行结果
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:28 2024/11/13
type PluginResult struct {
ID string `json:"id"` // 插件ID
StartTime int64 `json:"start_time"` // 开始执行时间: ms
FinishTime int64 `json:"finish_time"` // 完成执行时间: ms
IsSuccess bool `json:"is_success"` // 是否成功
SkipFailure bool `json:"skip_failure"` // 执行失败跳过异常继续执行
Data map[string]any `json:"data"` // 输出的数据
ErrMsg string `json:"err_msg"` // 失败原因
Config map[string]any `json:"config"` // 插件的配置数据
}

30
plugins/abstract.go Normal file
View File

@ -0,0 +1,30 @@
// Package plugins ...
//
// Description : plugins ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2024-11-13 16:21
package plugins
import (
"git.zhangdeman.cn/gateway/core/define"
)
// IPlugin 插件全局接口约束
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:22 2024/11/13
type IPlugin interface {
// ID 插件ID, 全局唯一, 不允许重复
ID() string
// Description 插件描述,描述插件的作用
Description() string
// Config 读取插件的配置
Config() (map[string]any, error)
// SkipFailure 插件执行失败, 是否跳过
SkipFailure() bool
// Logic 插件执行的逻辑
Logic(rc *define.RequestContext) *define.PluginResult
}