Gin 接口超时控制
文章目录
- 1.Gin 的 Middleware
- 2.gin-contrib/timeout
- 3.小结
- 参考文献
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 mainimport ("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 中间件。基于不重复造轮子的原则,建议使用官方库。
参考文献
OpenAI ChatGPT
Using middleware | Gin Web Framework
gin-contrib/timeout
Gin增加超时控制中间件 - 半码博客
相关文章:
Gin 接口超时控制
文章目录1.Gin 的 Middleware2.gin-contrib/timeout3.小结参考文献API 是现代应用程序中的重要组成部分,可以用于提供数据和功能,供客户端应用程序访问。由于网络不稳定、服务器负载、网络拥堵等因素,API 请求可能会花费较长时间。这可能导致…...
1.C#与.NET简介
目录 一、C#语言及其特点 二、C#与.NET Framework/.NET Core关系 三、C#应用开发 四、案例展示 五、学习环境 一、C#语言及其特点 C#是美国微软公司发布的一种面向对象的,运行于 .NET Framework 和 .NET Core (完全开源,跨平台ÿ…...
OpenAI CTO、吴恩达夫人……AI 领域值得关注的「她」力量,个个都是女强人
内容一览: 「她时代」来临,一些有着强大信念与热情的女性,纷纷投身至 AI 领域,成为不可或缺的存在与力量。值此国际妇女节到来之际,HyperAI超神经盘点了领域内令人印象深刻的杰出的女性代表。 关键词:国际妇…...
[ 网络 ] 应用层协议 —— HTTP协议
目录 1.HTTP协议 1.1URL urlencode和urldecode 2. HTTP协议格式 HTTP请求 HTTP响应 3.告知服务器意图的HTTP方法 GET:获取资源 POST:传输实体主体 GET和POST的区别 使用Cookie的状态管理 4.返回结果的HTTP状态码 状态码告知从服务器端返回的…...
Spring Boot 整合 Redisson 缓存性能客户端(2023-03-06)
Spring Boot 整合 Redisson 缓存 (官网) 介绍: Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorte…...
【C和C++】输出100内能够被13整除的数,取模判断方法
目录 前言基础概念重温整除例子小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付和解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就是金钱(…...
STC8单片机基于开源库读取DS18B20数据例程
STC8单片机基于开源库读取DS18B20数据例程 📍开源库FwLib_STC8 Github地址:https://github.com/IOsetting/FwLib_STC8📌STC官方STC8库函数资源:https://www.stcai.com/khs🎉本次利用FwLib_STC8库读取DS18B20,由于该开源库是基于VSCode编写,默认使用的是SDCC编译器,在…...
计算机专业毕业设计基于Spring Boot 学生在线考试系统
目录 一、学生端 1.1 登录 1.2 注册 1.3 学生首页 1.4 学生查看任务中心的试卷(已答卷/未答卷) 1.5 学生查看固定试卷以及开始做题 1.6 学生查看时段试卷以及开始做题 1.7 学生查看试卷中心 1.8 学生查看考试记录以及查看试卷 1.9 学生查看…...
【读书笔记】《深入浅出数据分析》第八章 启发法
目录一,什么是启发法?1,那什么是启发法?2,心理学上对启发法定义二,活动分析1,如何去分析活动效果呢?1.1 活动前期(活动前1-2周)1.2 活动中期1.3 活动结束一&a…...
英飞凌Tricore实战系列导读
本文框架 1.系列概述1.1 外设理论及应用介绍1.2 基于TC3xx的MCAL各外设配置开发1.3 基于TC3xx的Davinci工程开发1.4 项目中问题排查经验分享1.5 其他相关话题分享2. 目前已发布系列文章汇总1.系列概述 英飞凌TC3xx以其强大的性能,扩展性,存储及安全性能在汽车电子中扮演着越…...
做数据分析有前景吗?
当然有前景的。 每个行业都有发展前景,只是看你自身的技能情况或者关系人脉、软实力方面是否到位,不同的行业要求不一样。作为数据分析领域而言,属于IT行业,看的是你的专业技能;只要你技能过硬,就能在行业…...
Rust Web入门(六):服务器端web应用
本教程笔记来自 杨旭老师的 rust web 全栈教程,链接如下: https://www.bilibili.com/video/BV1RP4y1G7KF?p1&vd_source8595fbbf160cc11a0cc07cadacf22951 学习 Rust Web 需要学习 rust 的前置知识可以学习杨旭老师的另一门教程 https://www.bili…...
1.特定领域知识图谱知识融合方案(实体对齐):金融产业产业知识图谱-基于内容匹配和图模型的品牌知识链指
1 引言 供应链金融是一种围绕经营关系,以核心企业为依托,针对中小企业的新型金融服务。如何精准地还原企业间的经营关系,是供应链金融的关键所在。知识图谱是描绘实体间关系的网络结构,对于挖掘企业关系有重要意义。在真实场景中,仅有企业与用户的微观知识对于还原经营关系…...
前端基础语法合集
JS语法基础1-注释//单行注释/*......*/多行注释2-分号;用作分割javascript语句,可以省略。3-变量定义定义变量使用varvar a;//声明变量 var a100;//声明变量并赋值 var b,c;//声明多个变量 var d20;bd1;cb1;//一行多条语句要用;分割4-数据类型判断该变量…...
百亿补贴,京东的自卫反击战
“百亿补贴”这个词大家有没有很熟悉?大部分人应该是在看拼多多投放广告的时候,知道这个词的吧。而京东APP也于近日在升级11.6.2版本时,在更新日志中明确提到:“京东3.8节,百亿补贴上线”。至此,发酵数日的…...
融云入选中国信通院《高质量数字化转型产品及服务全景图》
企业数字化转型正在进入“深水区”。 3 月 3 日,“中国信息通信研究院(以下简称中国信通院)高质量数字化转型创新发展大会暨中国信通院‘铸基计划’年度峰会”在京召开,深度展示了中国信通院在数字化转型领域的工作成果ÿ…...
开源消息代理组件mosquitto
# ll total 556 -rw-r----- 1 sk sk 148417 Mar 6 14:59 libuv-1.44.2-1.el7.x86_64.rpm -rw-r----- 1 sk sk 120717 Mar 6 14:59 libwebsockets-3.0.1-2.el7.x86_64.rpm -rw-r----- 1 sk sk 293429 Mar 6 14:59 mosquitto-1.6.10-1.el7.x86_64.rpm 将用到的依赖上传到主机…...
vuex的五个属性及使用方法示例
一,Vuex简介 Vuex是Vue.js的状态管理库,它通过中心化的状态管理使得组件间的数据共享更加容易。 Vuex包含五个核心属性:state、getters、mutations、actions和modules。 Vuex是Vue.js的状态管理库,它提供了一种集中式存储管理应…...
9.SpringSecurity核心过滤器-SecurityContextPersistenceFilter
SpringSecurity核心过滤器-SecurityContextPersistenceFilter 一、SpringSecurity中的核心组件 在SpringSecurity中的jar分为4个,作用分别为 jar作用spring-security-coreSpringSecurity的核心jar包,认证和授权的核心代码都在这里面spring-security-co…...
23种设计模式-桥接模式
概念 桥接模式是一种结构型设计模式,它通过将抽象与其实现分离来解耦。它使用接口(抽象类)作为桥梁,将一个抽象类与其实现类的代码分别独立开来,从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
