当前位置: 首页 > 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服务器,并使用超时上下文经过指定的时间实现优雅关闭。
注意: 在实际应用程序中,您应该使用一个更严格的上下文,如超时上下文,以确保在关闭服务器前处理所有请求。

http://www.lryc.cn/news/102156.html

相关文章:

  • 【数字IC设计】VCS仿真DesignWare IP
  • 【*1900 图论+枚举思想】CF1328 E
  • AutoSAR系列讲解(实践篇)10.5-通信管理模块
  • 2023.7.30(epoll实现并发服务器)
  • 小研究 - 基于解析树的 Java Web 灰盒模糊测试(一)
  • SpringBoot接手JSP项目--【JSB项目实战】
  • Python模块psycopg2连接postgresql
  • Kotlin基础(八):泛型
  • Java学习笔记——(10)环境变量path配置及其作用
  • 【图像去噪】基于进化算法——自组织迁移算法(SOMA)的图像去噪研究(Matlab代码实现)
  • TMS WEB Core Crack,TMS软件Delphi组件RADical Web
  • PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法
  • 解决:移动端H5的<video>初始化拿不到总时长
  • 百度云上传身份证获取身份信息封装
  • vscode 上cmake 版本过低
  • OS-08-事件驱动:C10M是如何实现的?
  • mysql 主从同步排查和处理 Slave_IO、Slave_SQL
  • 基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)
  • 07mysql查询语句之子查询
  • 笙默考试管理系统-MyExamTest(22)
  • Windows 不同方式打开的cmd/dos窗口属性配置不同
  • 性能优化-webpack配置gzip
  • RabbitMQ 教程 | 第3章 客户端开发向导
  • 基于深度学习的CCPD车牌检测系统(PyTorch+Pyside6+YOLOv5模型)
  • input元素中的form属性有什么用?
  • 【数据结构篇C++实现】- 特殊的线性表 - 串
  • DevOps系列文章 之 Springboot单元测试
  • 04 linux之C 语言高级编程
  • 深入学习 Redis - Stream、Geospatial、HyperLogLog、Bitmap、Bitfields 类型扩展
  • Windows11+Opencv+Clion编译源码