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

go语言gin框架平滑关闭——思悟项目技术2

目录

前言

直接关闭的缺陷

平滑关闭的使用场景

例子


思悟项目:

golang qq邮件发送验证码——思悟项目技术1


前言

平滑关闭(graceful shutdown)是指在停止服务时,能够让现有的连接、任务或者操作优雅地完成,而不是直接中断。

平滑关闭的核心思想是在系统接收到停止信号后,不再接收新请求,只处理当前正在执行的请求,确保所有请求完成后,系统才正式关闭。

直接关闭的缺陷

比如说有一个web服务,我们要升级web服务,也就是版本迭代。但是在升级前,要先把服务关闭。我们可以直接包里终止程序,然后启动新的服务,但是这样做存在缺陷:

  • 当前的请求可能会被中断,导致数据丢失。
  • 未完成的后台任务会被强行中断。(用户体验感也会很差)
  • 数据库连接、文件等资源可能没有机会释放,导致潜在的资源泄漏。

平滑关闭的使用场景

  1. 项目版本迭代
  2. 服务重启维护
  3. 服务迁移
  4. 防止数据丢失

(例如王者荣耀更新时,正在打游戏的玩家不会更新,等到这局游戏结束后才会进行更新。)

例子

package mainimport ("context""errors""github.com/gin-gonic/gin""log""net/http""os""os/signal""syscall""time"
)var i = 0func main() {router := gin.Default()// 创建两个接口,一个延迟9秒钟返回信息router.GET("/a", func(c *gin.Context) {time.Sleep(9 * time.Second)i++c.JSON(http.StatusOK, gin.H{"num": i,})})// 一个立刻返回信息router.GET("/b", func(c *gin.Context) {i++c.JSON(http.StatusOK, gin.H{"num": i,})})// 创建一个 http.Serversrv := &http.Server{Addr:    ":8080",Handler: router,}// 在协程中启动服务器go func() {if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {log.Fatalf("listen: %s\n", err)}}()// 创建信号通道,监听 SIGINT 和 SIGTERMquit := make(chan os.Signal, 1)signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)// 阻塞直到收到信号si := <-quitlog.Println("Shutting down server...", si)// shutdown方法需要传入一个上下文参数,有两种写法:// 1.带超时,接收到信号之后,9秒之后无论当前请求是否完成都强制断开ctx, cancel := context.WithTimeout(context.Background(), 9*time.Second)// 2.不带超时,等待当前请求全部完成再断开// ctx, cancel = context.WithCancel(context.Background())defer cancel()// 调用 Shutdown 方法平滑关闭if err := srv.Shutdown(ctx); err != nil {// 当请求还在的时候强制断开了连接将产生错误,err不为空log.Fatal("Server forced to shutdown:", err)}log.Println("Server exiting")
}

步骤具体为:

  1. 捕获信号:使用 os/signal 包捕获终止信号。
  2. 创建 context:创建一个 context,当捕获到信号时触发 context 的取消,从而让正在进行的任务停止接收新的请求。
  3. 调用 Shutdown 方法:http.Server 提供了一个 Shutdown 方法,接受一个 context,它会让服务器停止接收新的请求,等待处理完当前正在进行的请求,等待时间由 context 决定。

参考:Golang 平滑重启之优雅关机

相关文章:

go语言gin框架平滑关闭——思悟项目技术2

目录 前言 直接关闭的缺陷 平滑关闭的使用场景 例子 思悟项目&#xff1a; golang qq邮件发送验证码——思悟项目技术1 前言 平滑关闭&#xff08;graceful shutdown&#xff09;是指在停止服务时&#xff0c;能够让现有的连接、任务或者操作优雅地完成&#xff0c;而不是…...

K8S flannel网络模式对比

K8S flannel网络模式对比 VXLAN 模式Host-GW 模式如何查看 Flannel 的网络模式?如何修改 Flannel 的网络模式?如何修改flannel vxlan端口?Flannel 是一个 Kubernetes 中常用的网络插件,用于在集群中的节点之间提供网络连接。Flannel 提供了多种后端实现方式,vxlan 和 host…...

Vue前端框架:Vue前端项目文件目录

文章目录 package.json 文件node_modulessrc&#xff08;Source Code 的缩写&#xff09;文件夹主要子文件夹及内容 publicdist package.json 文件 所在文件夹&#xff08;通常是项目根目录&#xff09; 虽然 package.json 本身不是一个文件夹&#xff0c;但它所在的文件夹&a…...

git回滚到指定的提交

如果你想回滚到特定的提交&#xff08;例如 aa0ca72c&#xff09;&#xff0c;并且丢弃之后的所有更改&#xff0c;可以使用 git reset 命令。请注意&#xff0c;git reset 会改变你的提交历史&#xff0c;所以在多人协作项目中应谨慎使用。如果已经推送到远程仓库&#xff0c;…...

手机怎么玩森林之子?远程玩森林之子教程

你喜欢《森林之子》这款开放世界恐怖生存模拟游戏吗&#xff1f;玩家会被派到一座孤岛上&#xff0c;寻找一位失踪的亿万富翁&#xff0c;并深陷被食人生物占领的地方。你需要制作工具和武器、建造房屋&#xff0c;倾尽全力生存下去&#xff0c;无论独自一人还是与朋友一起。如…...

深度学习之网络与计算

1 网络操作与计算 1.1 前向传播与反向传播&#xff1f; 神经网络的计算主要有两种&#xff1a;前向传播&#xff08;foward propagation, FP&#xff09;作用于每一层的输入&#xff0c;通过逐层计算得到输出结果&#xff1b;反向传播&#xff08;backward propagation, BP&a…...

《JVM第1课》Java 跨平台原理

无痛快速学习JVM&#xff0c;欢迎订阅本免费专栏 JVM Java的特性就是程序员一次编写&#xff0c;到处运行&#xff0c;意思是我们只需要写一份代码&#xff0c;就可以在不同的操作系统&#xff08;windows、Linux、Mac OS等&#xff09;中运行。但是不同的操作系统能看懂的指令…...

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30目录1. Step Guided Reasoning: Improving Mathematical Reasoning using Guidance Generation and Step Reasoning摘要研究背…...

加强版 第五节图像处理与视频分析

基本概念 图像轮廓 主要针对二值图像&#xff0c;轮廓是一系列点 vector<vector<Point>xxx用于存储多个点 vector<Vec4i>xxx包含四个整数&#xff0c;分别代表下一个轮廓的索引&#xff0c;上一个轮廓的索引&#xff0c;一个子轮廓的索引和父轮廓的索引 相…...

Orleans8.2入门测试

微软官方文档&#xff1a;快速入门&#xff1a;使用 ASP.NET Core 生成第一个 Orleans 应用 - .NET | Microsoft Learn 项目及引入的nuget库&#xff1a; 1、接口项目&#xff1b;2、接口实现项目&#xff1b;3、silo项目&#xff1b;4、客户端项目 其中Microsoft.Orleans.St…...

【Linux 25】网络套接字 socket 概念

文章目录 &#x1f308; 一、IP 地址概念⭐ 1. IP 地址的作用⭐ 2. 源 IP 地址和目的 IP 地址 &#x1f308; 二、端口号概念⭐ 1. 源端口号和目的端口号⭐ 2. 端口号范围划分⭐ 3. 端口号 VS 进程 ID⭐ 4. 套接字 socket 的概念 &#x1f308; 三、传输层的典型代表协议⭐ 1. …...

python openai 通过Function Call 创建自动化任务

目录 一、什么是Function Call(函数掉用) 1. 功能概述 2. 工作原理 二、如何实现函数调用 1、定义自己的get_weather 函数 2、给助手添加函数调用 3、写好instrction,指导assistant去掉用你定义的方法。 4、最后也是最重要的,捕获 Assistant 的 Function Call 三、…...

设计模式之责任链的通用实践思考

责任链模式通常一般用在方法的拦截、监控、统计方面&#xff0c;比较典型的就是Spring的AOP拦截。 但写一些小的基础能力框架的时候&#xff0c;用AOP比较中&#xff0c;所以一般都是自己针对特定的功能写一些定制的责任链工具类&#xff0c;不太喜欢总是做一些定制化的东西&am…...

前端用canvas绘图并支持下载

1.根据数据绘制饼图 /** 绘制环形图 */ const drawPieCharts () > {const {canWithdrawalPriceFront,noWithdrawalPriceFront,haveWithdrawalPriceFront,} this.state;const myCanvas this.cavasRef.current;// ts-ignoreconst ctx myCanvas.getContext(2d);if (ctx) {…...

【Mac】Homebrew

1、Homebrew 简介 官网地址&#xff1a;https://brew.sh Homebrew 是一款Mac OS平台下的软件包管理工具&#xff0c;拥有安装、卸载、更新、查看、搜索等很多实用的功能。 Homebrew 主要有四个部分组成: brew、homebrew-core 、homebrew-bottles、homebrew-cask。 源说明br…...

Python笔记之线程库threading

Python笔记之线程库threading 参考博文 Python多线程笔记——简单函数版和类实现版 code review! Python 的 threading 库用于在程序中创建和管理线程。线程允许程序并发执行多个任务。以下是 threading 库的详解和一些简洁示例。 基本概念 线程&#xff1a;在一个进程中&a…...

go 包管理

Go语言所依赖的所有的第三方库都放在GOPATH目录下面 gomodule是Go语言默认的依赖管理工具 Modules是相关Go包的集合&#xff0c;是源代码交换和版本控制的单元&#xff0c;用于指定使用哪些源文件 GO111MODULEoff禁用gomodule&#xff0c;编译时从GOPATH和vendor文件夹中查找包…...

Js内建对象

数组解构 const arr ["1","2","3"]let a,b,c// 解构赋值 //将数组的第一个元素赋值给第一个变量&#xff0c;第二个元素赋值给第二个变量&#xff0c;依次类推[a,b,c] arr console.log(a,b,c) // 1 2 3 // 声明变量同时解构 let [a,b,c] [&qu…...

AXI接口的实现逻辑和底层原理,在FPGA中如何实现AXI接口,一篇文章足以搞明白!!!

AXI&#xff08;Advanced eXtensible Interface&#xff09;接口是一个点对点的接口&#xff0c;用于连接高性能的片上系统&#xff08;SoC&#xff09;中的处理器、外围设备、内存和其他IP核。以下是对AXI接口的详细解析&#xff0c;包括FPGA实现的原理、逻辑、速度以及详细的…...

《GBDT 算法的原理推导》 11-12计算损失函数的负梯度 公式解析

本文是将文章《GBDT 算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式(11-12)是GBDT算法中非常关键的一步&#xff0c;它表示了如何通过计算损失函数的负梯度来指导下一棵树的生长。 公式(11-12)如下&#xff1a; r m i − [ ∂ …...

C++ 模板元编程语法大全

C 模板元编程语法大全 模板元编程(Template Metaprogramming, TMP)是C中利用模板在编译期进行计算和代码生成的强大技术。以下是C模板元编程的核心语法和概念总结&#xff1a; 1. 基础模板语法 类模板 template <typename T> class MyClass {// 类定义 };函数模板 t…...

【术语扫盲】BSP与MSP

专业解释版&#xff1a; MSP&#xff08;Microcontroller Support Package&#xff09; 定义&#xff1a;MSP 是微控制器支持包&#xff0c;包含 MCU 的启动代码、寄存器配置、驱动库等&#xff0c;主要针对 芯片本身。 作用&#xff1a;提供通用的底层硬件抽象&#xff0c;方…...

VASP 教程:VASP 结合 Phonopy 计算硅的比热容

VASP 全称为 Vienna Ab initio Simulation Package&#xff08;The VASP Manual - VASP Wiki&#xff09;是一个计算机程序&#xff0c;用于从第一性原理进行原子尺度材料建模&#xff0c;例如电子结构计算和量子力学分子动力学。 Phonopy&#xff08;Welcome to phonopy — Ph…...

专业课复习笔记 11

从今天开始每天下午复习专业课。慢慢复习专业课。目标至少考一个一百分吧。毕竟专业课还是比较难的。要是考不到一百分&#xff0c;我感觉自己就废掉了呢。下面稍微复习一下计组。 复习指令格式和数据通路设计。完全看不懂&#xff0c;真是可恶啊。计组感觉就是死记硬背&#…...

Oracle基础知识(五)——ROWID ROWNUM

目录 一、ROWID 伪列 二、ROWNUM——限制查询结果集行数 1.ROWNUM使用介绍 2.使用ROWNUM进行分页查询 3.使用ROWNUM查看薪资前五位的员工 4.查询指定条数直接的数据 三、ROWNUM与ROWID不同 一、ROWID 伪列 表中的每一行在数据文件中都有一个物理地址&#xff0c;ROWID…...

STM32 通过 ESP8266 通信详解

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注我的知乎&#xff1a;对error视而不见 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领…...

如何优化微信小程序中渲染带有图片的列表(二进制流存储方式的图片存在本地数据库)

方法一&#xff1a;对列表的获取进行分页处理 实现方法&#xff1a; 前端请求&#xff08;需要向后端传两个参数&#xff0c;pageIndex是获取第几页是从0开始&#xff0c;pageSize是这一页需要获取多少个数据&#xff09; 后端接口实现&#xff08;因为这里是通过参数拼接请求…...

工控机安装lubuntu系统

工控机安装lubuntu系统指南手册 1. 准备 1个8G左右的U盘 下载Rufus&#xff1a; Index of /downloads 下载lubuntu系统镜像&#xff1a; NJU Mirror Downloads – Lubuntu 下载Ventoy工具&#xff1a; Releases ventoy/Ventoy GitHub 下载后&#xff0c;解压&#…...

第 1 章:学习起步

1. React Native前置知识要求 在开始学习React Native之前&#xff0c;有一些前置知识你需要了解。不过别担心&#xff0c;我会带你逐步掌握这些内容&#xff0c;让你顺利入门。 1.1. JavaScript是必须掌握的 学习React Native&#xff0c;JavaScript是基础。你需要了解Java…...

机械师安装ubantu双系统:三、GPT分区安装Ubantu

目录 一、查看磁盘格式 二、安装ubantu 参考链接&#xff1a; GPT分区安装Ubuntu_哔哩哔哩_bilibili 一、查看磁盘格式 右击左边灰色区域&#xff0c;点击属性 二、安装ubantu 插入磁盘&#xff0c;重启系统&#xff0c;狂按F7&#xff08;具体我也忘了&#xff09;&#…...