当前位置: 首页 > news >正文

【转载】Gin框架优雅退出

转载自: https://juejin.cn/post/7212786062224146487

Gin是一个非常流行的Web框架,经常被用于构建高性能、易于维护的Web应用。在领域驱动设计(DDD)和微服务等方面也有广泛应用。但是,像其他应用程序一样,当我们需要停止Gin
Web服务时,必须处理关闭连接和释放内存等问题,以避免服务异常或不规范退出。 本文将介绍如何使用Gin框架优雅退出。

优雅退出的原理

传统的停止 Golang web 服务做法是调用关闭 TCP 连接的API。问题是如果此时有请求正在处理 HTTP 请求,则会因为其中的go协程未结束而退出,从而导致一些资源泄露等问题。
优雅停止的方法是监听系统信号(例如ctrl+c)后,关闭给定的HTTP服务器,等待活动连接(advisory TCP close)完成所有请求的数据交换并断开连接。这确保每个客户端都可以正确地关闭。

Gin框架优雅退出

Gin框架提供了Server对接口,因此您可以更容易地在您的Gin应用程序中实现优雅退出。在这个应用程序中,您可以在监听到停止信号时使用Shutdown(duration)方法来安全地停止HTTP服务器。
以下是一个简单的Gin应用程序,它演示了如何实现优雅退出:

package mainimport ("context""log""net/http""os""os/signal""syscall""time""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {time.Sleep(time.Second * 5)c.JSON(http.StatusOK, gin.H{"message": "Hello, World!"})})//创建HTTP服务器server := &http.Server{Addr:    ":8080",Handler: r,}//启动HTTP服务器go func() {if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {log.Fatalf("listen: %s\n", err)}}()//等待一个INT或TERM信号quit := make(chan os.Signal)signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)<-quitlog.Println("Shutdown Server ...")//创建超时上下文,Shutdown可以让未处理的连接在这个时间内关闭ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()//停止HTTP服务器if err := server.Shutdown(ctx); err != nil {log.Fatal("Server Shutdown:", err)}log.Println("Server exiting")
}

在上面的示例中,我们定义了一个主函数,该函数创建了一个Gin应用程序,并启动一个HTTP服务器来处理来自客户端的HTTP请求。
这里主要是 Shutdown(),它使用一个上下文 context,等待了五秒钟的时间来优雅地关闭HTTP服务器。Shutdown方法将尝试安全地关闭HTTP服务器,并等待重新定位连接的HTTP请求的时间为超时。
如我们所见,回调函数对Wait信号进行了挂起。此后,通过涉及一个 SIGTERM 或 SIGINT 信号进行终止。这会导致程序输出有关关闭服务器的信息并调用Shutdown来安全地关闭服务器以达到优雅退出目的。

结论

在本文中,我们看到了Gin框架如何实现优雅退出。在停止服务时,您应该关闭所有连接,并确保在关闭时进行清理,以避免资源泄漏,同时确保与客户端的协商的合适交互。在本文完整代码中,我们使用SIGTERM和SIGINT信号从操作系统方便的捕获器回调中停止Web服务器,并使用超时上下文经过指定的时间实现优雅关闭。
注意: 在实际应用程序中,您应该使用一个更严格的上下文,如超时上下文,以确保在关闭服务器前处理所有请求。

相关文章:

【转载】Gin框架优雅退出

转载自&#xff1a; https://juejin.cn/post/7212786062224146487 Gin是一个非常流行的Web框架&#xff0c;经常被用于构建高性能、易于维护的Web应用。在领域驱动设计&#xff08;DDD&#xff09;和微服务等方面也有广泛应用。但是&#xff0c;像其他应用程序一样&#xff0c;…...

【数字IC设计】VCS仿真DesignWare IP

DesignWare介绍 DesignWare是SoC/ASIC设计者最钟爱的设计IP库和验证IP库。它包括一个独立于工艺的、经验证的、可综合的虚拟微架构的元件集合&#xff0c;包括逻辑、算术、存储和专用元件系列&#xff0c;超过140个模块。DesignWare和 Design Compiler的结合可以极大地改进综合…...

【*1900 图论+枚举思想】CF1328 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 注意到题目的性质&#xff1a;满足条件的路径个数是极少的&#xff0c;因为每个点离路径的距离<1 先考虑一条链&#xff0c;那么直接就选最深那个点作为端点即可 为什么&#xff0c;因为我们需要遍历所有点…...

AutoSAR系列讲解(实践篇)10.5-通信管理模块

目录 一、ComM 1、内部唤醒 2、外部唤醒 二、CanSM 三、状态关联 之前讲解了BswM和EcuM,详细讲解了BswM的配置,而大部分的配置都在BswM中做了,EcuM的配置就很简单了,基本上勾一勾就ok了。下面我们 来讲解模式管理还可能用到的通信模块 一、ComM ComM就像一个通信的总…...

2023.7.30(epoll实现并发服务器)

服务器 #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/epoll.h> #include <sys/socket.h> #include <sys/types.…...

小研究 - 基于解析树的 Java Web 灰盒模糊测试(一)

由于 Java Web 应用业务场景复杂, 且对输入数据的结构有效性要求较高, 现有的测试方法和工具在测试Java Web 时存在测试用例的有效率较低的问题. 为了解决上述问题, 本文提出了基于解析树的 Java Web 应用灰盒模糊测试方法. 首先为 Java Web 应用程序的输入数据包进行语法建模创…...

SpringBoot接手JSP项目--【JSB项目实战】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤【JSB系列之000】 文章目录 SpringBoot系列文章目录[TOC](文章目录) SpringBoot技术很多很多工作之初&#xff0c;面临JSP的老项目我要怎么办环境及工具&#xff1a;项目里可能要用到的技术JSPjstl其它的必要知识 上代码WE…...

Python模块psycopg2连接postgresql

目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…...

Kotlin基础(八):泛型

前言 本文主要讲解kotlin泛型&#xff0c;主要包括泛型基础&#xff0c;类型变异&#xff0c;类型投射&#xff0c;星号投射&#xff0c;泛型函数&#xff0c;泛型约束&#xff0c;泛型在Android中的使用。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 泛型基…...

Java学习笔记——(10)环境变量path配置及其作用

环境变量的作用为了在 Dos 的任务目录&#xff0c;可以去使用 javac 和 java开发工具命令 先配置 JAVA_HOME 指向 jdk 安装的主目录&#xff08;避免开发中出现问题&#xff09; 编辑 path 环境变量(开发环境)&#xff0c;增加 %JAVA_HOME%\bin 编辑 path 环境变量(运行环境…...

【图像去噪】基于进化算法——自组织迁移算法(SOMA)的图像去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

TMS WEB Core Crack,TMS软件Delphi组件RADical Web

TMS WEB Core Crack,TMS软件Delphi组件RADical Web 使用我们的现代web应用程序框架&#xff0c;可以节省宝贵的时间并创造丰富的用户体验。我们所有的工具都由经验丰富的开发人员组成的专门团队提供支持。您可以信赖卓越的服务、活跃的社区和我们不断的创新。TMS Software是您的…...

PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法

PHP使用Redis实战实录系列 PHP使用Redis实战实录1&#xff1a;宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2&#xff1a;Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3&#xff1a;数据类型比较、大小限制和性能扩展PHP使用Re…...

解决:移动端H5的<video>初始化拿不到总时长

移动端 在<video>的初始化后&#xff0c;会调用如下事件。 canplay"canplay" 解决方案&#xff1a;<video>添加自动播放属性&#xff1a; autoplay"autoplay" 然后这个方法里&#xff0c;用js在0.01秒后主动关闭播放&#xff0c;接着在0.…...

百度云上传身份证获取身份信息封装

1.目录结构 -script_discerm ------------包 -discerm.py --------------主要逻辑 -__init__.py -id_care---------------文件夹 存放图片 2.安装模块 pip install urllib31.23 pip install requests pip install base64 3.各文件内容 2.1 discerm.py import jsonimpo…...

vscode 上cmake 版本过低

问题&#xff1a; 装了vscode中的camke插件后&#xff0c;报错如下&#xff1a; CMake 3.9 or higher is required. You are running version 3.3.2。 解决办法&#xff1a; 卸载掉插件的cmake。 到官网下载合适的版本&#xff0c;设置系统变量 然后重新下载camke tools&…...

OS-08-事件驱动:C10M是如何实现的?

08-事件驱动&#xff1a;C10M是如何实现的&#xff1f; 你好&#xff0c;我是陶辉。 上一讲介绍了广播与组播这种一对多通讯方式&#xff0c;从这一讲开始&#xff0c;我们回到主流的一对一通讯方式。 早些年我们谈到高并发&#xff0c;总是会提到C10K&#xff0c;这是指服务…...

mysql 主从同步排查和处理 Slave_IO、Slave_SQL

目录 查看主从是否同步 详解Slave_IO、Slave_SQL 判断主从完全同步 各个 Log_File 和 Log_Pos的关系 修复命令 查看主从是否同步 show slave status; Slave_IO_Running、Slave_SQL_Running&#xff0c;这两个值是Yes表示正常&#xff0c;No是异常 使用竖排显示&#xf…...

基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…...

07mysql查询语句之子查询

#1.查询和Zlotkey相同部门的员工姓名和工资 SELECT last_name,salary FROM employees WHERE department_id IN ( SELECT department_id FROM employees WHERE last_name Zlotkey ); #2.查询工资比公司平均工资高的员工的员工号&#xff0…...

中兴光猫工厂模式智能解锁:3步获得完全控制权限

中兴光猫工厂模式智能解锁&#xff1a;3步获得完全控制权限 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 你是否曾因中兴光猫的限制而无法进行高级网络配置&#xff1f;是否在需要深…...

CANN-opbase-昇腾NPU算子开发的基础设施为什么这么重要

CANN-opbase-昇腾NPU算子开发的基础设施为什么这么重要 所有 CANN AOL 算子仓库的底层都依赖 opbase。它不提供任何算子实现&#xff0c;提供的是算子注册、编译、调度的基础设施。如果你要写自定义 Ascend C 算子&#xff0c;opbase 是绕不过去的第一步。 opbase 提供了什么组…...

百度网盘限速破解:技术解析与实战应用深度剖析

百度网盘限速破解&#xff1a;技术解析与实战应用深度剖析 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在云存储服务日益普及的今天&#xff0c;百度网盘作为国内用户最常用…...

Mythos大模型:跨栈系统直觉与自主运维能力解析

1. 这不是一次普通升级&#xff1a;Mythos 的能力跃迁本质是什么&#xff1f;如果你过去三年持续关注大模型演进&#xff0c;大概率会记得2023年Claude 2发布时那种“稳扎稳打”的观感——推理更连贯、长文本更可靠、越狱难度更高&#xff0c;但没人会说它“颠覆了什么”。2024…...

AV1编码背景及现状

AV1&#xff08;AOMedia Video 1&#xff09;是一种开放的、免版税的视频编码标准&#xff0c;由开放媒体联盟开发。该标准的最初设计目的是用于互联网上的视频传输&#xff0c;同时提供一个对所有用户开放且无须支付版税的视频压缩解决方案。作为 VP9的下一代视频编码标准&…...

E-Hentai Downloader:三步解决漫画批量下载与打包难题的实用指南

E-Hentai Downloader&#xff1a;三步解决漫画批量下载与打包难题的实用指南 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 还在为手动保存上百张漫画图片而烦恼吗&am…...

Arty S7 FPGA开发板:从入门到进阶的硬件加速与嵌入式开发实战

1. 项目概述&#xff1a;为什么是Arty S7&#xff1f;如果你是一名嵌入式开发者、数字电路设计的学生&#xff0c;或者对硬件加速、实时信号处理感兴趣&#xff0c;那么“FPGA开发板”这个词对你来说一定不陌生。但面对市场上琳琅满目的开发板&#xff0c;从几百元到上万元不等…...

用RT-Thread Studio玩转STM32 PWM:从电机控制到呼吸灯,一个框架搞定

用RT-Thread Studio玩转STM32 PWM&#xff1a;从电机控制到呼吸灯&#xff0c;一个框架搞定 在嵌入式开发领域&#xff0c;PWM&#xff08;脉冲宽度调制&#xff09;技术堪称"瑞士军刀"般的存在。无论是调节电机转速、控制舵机角度&#xff0c;还是实现LED呼吸灯效果…...

ARM指令集BIC与CMP指令详解及应用场景

1. ARM指令集基础与BIC/CMP指令概述在嵌入式系统和低功耗计算领域&#xff0c;ARM架构凭借其精简指令集(RISC)设计占据了主导地位。作为开发者&#xff0c;深入理解ARM指令集的工作原理对于编写高效底层代码至关重要。今天我们将重点剖析两个关键指令&#xff1a;BIC&#xff0…...

从单机到团队协作:手把手教你用SVN在Windows上搭建个人小型项目版本库(含汉化与日常使用图解)

从单机到团队协作&#xff1a;Windows环境下SVN轻量化部署与实战指南 在个人开发和小型团队协作中&#xff0c;版本控制是保证代码安全和团队高效协作的基石。对于Windows平台的开发者而言&#xff0c;SVN&#xff08;Subversion&#xff09;以其简单可靠的特点&#xff0c;成为…...