Gin 接口超时控制
文章目录
API 是现代应用程序中的重要组成部分,可以用于提供数据和功能,供客户端应用程序访问。由于网络不稳定、服务器负载、网络拥堵等因素,API 请求可能会花费较长时间。这可能导致客户端应用程序在等待响应时出现延迟,最终导致用户不满意,甚至放弃使用应用程序。
为了避免这种情况,可以为 API 请求设置超时时间。超时时间是指在一定时间内,如果 API 请求没有得到响应,将自动取消该请求。这可以防止客户端应用程序一直等待 API 响应,从而提高用户体验。
1.Gin 的 Middleware
Gin 是一种轻量级的 Web 框架,用于构建高性能的 Web 应用程序。它具有快速、简单和易于使用的特点,并且具有许多可扩展的功能,如中间件。
在 Gin 框架中,中间件是一种用于拦截 HTTP 请求和响应的机制。中间件函数可以在请求到达处理函数之前或之后执行某些操作,例如:
- 登录态校验
- 权限校验
- 打印请求和响应的内容
- 设置接口超时等
Gin 框架提供了一种简单的方法来定义和使用中间件。中间件函数需要满足以下条件:
- 函数的签名必须是 func(c *gin.Context),其中 c 是 Gin 框架中的上下文对象。
- 函数可以执行任何操作,但是必须调用 c.Next() 方法来继续执行请求处理程序和其他中间件函数。
- 如果需要在请求处理程序之后执行某些操作,可以在调用 c.Next() 之后执行。
2.gin-contrib/timeout
在 Gin 中,可以使用中间件来设置 API 请求的处理超时时间。
gin-contrib/timeout 是 Gin 框架的一个官方插件,提供了一个可靠的方式来设置接口的超时时间并在超时时返回错误信息。使用 gin-contrib/timeout 可以大大简化我们的代码,使代码更加清晰易懂。
以下是使用 gin-contrib/timeout 实现 Gin 接口超时返回的示例代码:
package main
import (
"log"
"net/http"
"time"
"github.com/gin-contrib/timeout"
"github.com/gin-gonic/gin"
)
func testResponse(c *gin.Context) {
c.JSON(http.StatusGatewayTimeout, gin.H{
"code": http.StatusGatewayTimeout,
"msg": "timeout",
})
}
func timeoutMiddleware() gin.HandlerFunc {
return timeout.New(
timeout.WithTimeout(3000*time.Millisecond),
timeout.WithHandler(func(c *gin.Context) {
c.Next()
}),
timeout.WithResponse(testResponse),
)
}
func main() {
r := gin.New()
r.Use(timeoutMiddleware())
r.GET("/slow", func(c *gin.Context) {
time.Sleep(5000 * time.Millisecond)
c.Status(http.StatusOK)
})
if err := r.Run(":8080"); err != nil {
log.Fatal(err)
}
}
在示例代码中,我们使用 timeout.New() 函数来创建一个中间件,并将超时时间设置为 3 秒。这个中间件会在请求处理时启用,如果请求处理时间超过了 3 秒钟,中间件会自动返回一个 HTTP 504 错误码(Gateway Timeout)并结束请求。这样我们就能够在 Gin 框架中非常方便地实现接口超时返回功能了。
访问接口 /slow 我们将会得到如下回包。
{
"code": 504,
"msg": "timeout"
}
3.小结
在本文中,我们介绍了为什么要给 API 设置超时时间,以及在 Gin 中使用 Middleware 设置超时时间的方法。通过合理地
关于 gin-contrib/timeout 具体实现,感兴趣的同学可以深入研究其源码。
当然,我们也可以自己实现 timeout 中间件。基于不重复造轮子的原则,建议使用官方库。
相关文章
- 重磅!公开基于“内心对话”的EEG脑机接口数据集,助力语音意念控制研究
- 索尼相机BLE控制接口
- 流程控制-循环语句
- python控制键盘鼠标实现窗口程序自动化2021.10.14
- 利用自定义CSS接口控制页面文字大小的图文教程
- C语言运算符表达式和流程控制语句
- 马斯克看上的脑机接口公司:“意念控制”iPad发短信,浏览新闻无压力
- LyScriptTools 调试控制类API接口手册
- 中风患者使用对侧大脑半球控制脑机接口的能力探索
- EasyCVR平台onvif接入云台控制接口,出现延时是什么原因?
- 使用Oracle中的IF语句实现复杂逻辑控制(oracle中的if语句)
- 控制深入浅出:Linux内核进程控制(linux原理进程)
- CSS3 文本控制
- 深入浅出MySQL流程控制(mysql流程控制)
- 本轮疫情多久能基本得到控制?官方回应:2-3个潜伏周期
- 嵌入式Linux实现键盘控制:从硬件设计到软件程序(嵌入式linux键盘)
- Linux串口控制键盘,让你的电脑更灵活(linux串口键盘)
- Oracle事务控制语句实现数据安全事务处理(oracle事物控制语句)
- 展现Redis集群控制之道访问命令(redis集群访问命令)
- 突破界限Redis远程控制中间件(redis远程控制中间件)
- 教你如何用CSS来控制网页字体的显示样式
- jquery实现textarea输入字符控制(仿微博输入控制字符)
- 一个js控制的导航菜单实例代码
- Erlang中的函数与流程控制介绍