1 Star 0 Fork 0

vick/kinfu

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
httpServer.go 1.62 KB
一键复制 编辑 原始数据 按行查看 历史
package httpServer
// http接口超时控制
import (
"fmt"
"time"
"gitee.com/wu-jin-feng/kinfu/fgin"
"github.com/gin-contrib/timeout"
"github.com/gin-gonic/gin"
)
var Logger *fgin.FginSugaredLogger
func init() {
fgin.RegisteHttpPlug("http_timeout", &HttpTimeout{})
}
type HttpTimeout struct {
AllTimeout int `yaml:"all_timeout" json:"all_timeout" mapstructure:"all_timeout"` // 总控制的超时时间
RouteItems []HttpTimeoutItem `yaml:"route_items" json:"route_items" mapstructure:"route_items"` // 特别路由需要独立时间控制 单位s
}
type HttpTimeoutItem struct {
Route string `yaml:"route" json:"route" mapstructure:"route"` // 需要路由全称
Timeout int `yaml:"timeout" json:"timeout" mapstructure:"timeout"` // 单位s
}
func (s *HttpTimeout) Start(e *gin.Engine, logger *fgin.FginSugaredLogger) {
e.Use(s.TimeMiddware)
Logger = logger
Logger.Info("http_timeout注册成功")
}
func (s *HttpTimeout) TimeMiddware(ctx *gin.Context) {
nowTimeout := s.AllTimeout
for _, item := range s.RouteItems {
if ctx.Request.URL.Path == item.Route {
nowTimeout = item.Timeout
break
}
}
timeoutMiddware := timeout.New(
timeout.WithTimeout(time.Duration(nowTimeout)*time.Second),
timeout.WithHandler(func(c *gin.Context) {
// newContext, cancel := context.WithTimeout(c.Request.Context(), time.Duration(nowTimeout)*time.Second)
c.Next()
}),
timeout.WithResponse(func(c *gin.Context) {
Logger.Warn(fmt.Sprintf("%s, 耗时超过 %d s", c.Request.URL.Path, s.AllTimeout))
fgin.ReturnJson(c, 504, "", fmt.Errorf("请求超时"))
c.Abort()
}))
timeoutMiddware(ctx)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/wu-jin-feng/kinfu.git
git@gitee.com:wu-jin-feng/kinfu.git
wu-jin-feng
kinfu
kinfu
931f6b62b4c6

搜索帮助