我的编程空间,编程开发者的网络收藏夹
学习永远不晚

golang怎么优雅的关机或重启

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

golang怎么优雅的关机或重启

本文小编为大家详细介绍“golang怎么优雅的关机或重启”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang怎么优雅的关机或重启”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    优雅地关机或重启

    我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优雅的方式来实现关机或重启呢?

    阅读本文需要了解一些UNIX系统中信号的概念,请提前查阅资料预习。

    优雅地关机

    什么是优雅关机?

    优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在处理的请求全部处理完毕后再退出程序,是一种对客户端友好的关机方式。而执行Ctrl+C关闭服务端时,会强制结束进程导致正在访问的请求出现问题。

    如何实现优雅关机?

    Go 1.8版本之后, http.Server 内置的 Shutdown() 方法就支持优雅地关机,具体示例如下:

    // +build go1.8package mainimport ("context""log""net/http""os""os/signal""syscall""time""github.com/gin-gonic/gin")func main() {router := gin.Default()router.GET("/", func(c *gin.Context) {time.Sleep(5 * time.Second)c.String(http.StatusOK, "Welcome Gin Server")})srv := &http.Server{Addr:    ":8080",Handler: router,}go func() {// 开启一个goroutine启动服务if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {log.Fatalf("listen: %s\n", err)}}()// 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时quit := make(chan os.Signal, 1) // 创建一个接收信号的通道// kill 默认会发送 syscall.SIGTERM 信号// kill -2 发送 syscall.SIGINT 信号,我们常用的Ctrl+C就是触发系统SIGINT信号// kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它// signal.Notify把收到的 syscall.SIGINT或syscall.SIGTERM 信号转发给quitsignal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)  // 此处不会阻塞<-quit  // 阻塞在此,当接收到上述两种信号时才会往下执行log.Println("Shutdown Server ...")// 创建一个5秒超时的contextctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)defer cancel()// 5秒内优雅关闭服务(将未处理完的请求处理完再关闭服务),超过5秒就超时退出if err := srv.Shutdown(ctx); err != nil {log.Fatal("Server Shutdown: ", err)}log.Println("Server exiting")}

    如何验证优雅关机的效果呢?

    上面的代码运行后会在本地的8080端口开启一个web服务,它只注册了一条路由/,后端服务会先sleep 5秒钟然后才返回响应信息。

    我们按下Ctrl+C时会发送syscall.SIGINT来通知程序优雅关机,具体做法如下:

    • 打开终端,编译并执行上面的代码

    • 打开一个浏览器,访问127.0.0.1:8080/,此时浏览器白屏等待服务端返回响应。

    • 在终端迅速执行Ctrl+C命令给程序发送syscall.SIGINT信号

    • 此时程序并不立即退出而是等我们第2步的响应返回之后再退出,从而实现优雅关机。

    优雅地重启

    优雅关机实现了,那么该如何实现优雅重启呢?

    我们可以使用 fvbock/endless 来替换默认的 ListenAndServe启动服务来实现, 示例代码如下:

    package mainimport ("log""net/http""time""github.com/fvbock/endless""github.com/gin-gonic/gin")func main() {router := gin.Default()router.GET("/", func(c *gin.Context) {time.Sleep(5 * time.Second)c.String(http.StatusOK, "hello gin!")})// 默认endless服务器会监听下列信号:// syscall.SIGHUP,syscall.SIGUSR1,syscall.SIGUSR2,syscall.SIGINT,syscall.SIGTERM和syscall.SIGTSTP// 接收到 SIGHUP 信号将触发`fork/restart` 实现优雅重启(kill -1 pid会发送SIGHUP信号)// 接收到 syscall.SIGINT或syscall.SIGTERM 信号将触发优雅关机// 接收到 SIGUSR2 信号将触发HammerTime// SIGUSR1 和 SIGTSTP 被用来触发一些用户自定义的hook函数if err := endless.ListenAndServe(":8080", router); err!=nil{log.Fatalf("listen: %s\n", err)}log.Println("Server exiting")}

    如何验证优雅重启的效果呢?

    我们通过执行kill -1 pid命令发送syscall.SIGINT来通知程序优雅重启,具体做法如下:

    • 打开终端,go build -o graceful_restart编译并执行./graceful_restart,终端输出当前pid(假设为43682)

    • 将代码中处理请求函数返回的hello gin!修改为hello q1mi!,再次编译go build -o graceful_restart

    • 打开一个浏览器,访问127.0.0.1:8080/,此时浏览器白屏等待服务端返回响应。

    • 在终端迅速执行kill -1 43682命令给程序发送syscall.SIGHUP信号

    • 等第3步浏览器收到响应信息hello gin!后再次访问127.0.0.1:8080/会收到hello q1mi!的响应。

    • 在不影响当前未处理完请求的同时完成了程序代码的替换,实现了优雅重启。

    但是需要注意的是,此时程序的PID变化了,因为endless 是通过fork子进程处理新请求,待原进程处理完当前请求后再退出的方式实现优雅重启的。所以当你的项目是使用类似supervisor的软件管理进程时就不适用这种方式了。

    读到这里,这篇“golang怎么优雅的关机或重启”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    golang怎么优雅的关机或重启

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    golang怎么优雅的关机或重启

    本文小编为大家详细介绍“golang怎么优雅的关机或重启”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang怎么优雅的关机或重启”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。优雅地关机或重启我们编写的We
    2023-06-30

    vbs怎么实现的定时关机或重启

    这篇文章主要讲解了“vbs怎么实现的定时关机或重启”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vbs怎么实现的定时关机或重启”吧!代码如下:定时关机或重启的脚本,在windows 2000
    2023-06-08

    golang中怎么优雅地关闭http服务

    这篇文章主要介绍“golang中怎么优雅地关闭http服务”,在日常操作中,相信很多人在golang中怎么优雅地关闭http服务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang中怎么优雅地关闭htt
    2023-07-06

    怎么在Golang中优雅地关闭HTTP服务器

    这篇“怎么在Golang中优雅地关闭HTTP服务器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么在Golang中优雅地关
    2023-07-05

    美国服务器Linux系统怎么关闭或重启主机

    要关闭或重启美国服务器上的Linux系统主机,可以使用以下命令:关闭主机:sudo shutdown -h now这个命令会立即关闭主机。重启主机:sudo reboot这个命令会立即重启主机。请确保在执行这些命令之前保存好所有重要数
    美国服务器Linux系统怎么关闭或重启主机
    2024-04-20

    Ubuntu中的关机/重启确认怎么关闭

    这篇文章主要介绍“Ubuntu中的关机/重启确认怎么关闭”,在日常操作中,相信很多人在Ubuntu中的关机/重启确认怎么关闭问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ubuntu中的关机/重启确认怎么关闭
    2023-06-28

    云服务器怎么关机重启

    云服务器关机重启需要根据不同的情况进行具体的操作。以下是一些可能需要执行的步骤:检查服务器的连接:确保服务器正在使用,并有足够的电量和连接到互联网。可以检查服务器的控制面板或系统日志中是否有提示。检查服务器状态:查看服务器的操作系统和应用程序状态,确保它们正在运行中。可以手动设置服务器的状态。检查服务器配置文件:检查服务器配置文件,例如用户名、密码等。确保配置文件已正确更新和合法。关闭
    2023-10-26

    云服务器怎么开机关机重启

    打开控制面板。在Windows操作系统中,我们可以打开控制面板。在控制面板中,我们可以选择“管理工具”、“服务”、“实例”等选项。然后,在“服务”中找到“云服务”,右键单击选择“属性”。在属性窗口中,我们可以看到“服务状态”和“服务标识”两个选项。找到需要重启的云服务器。在控制面板中,我们可以找到需要重启的云服务器。
    云服务器怎么开机关机重启
    2023-10-28

    Golang怎么优雅的终止一个服务

    今天小编给大家分享一下Golang怎么优雅的终止一个服务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言采用常规方式启动一
    2023-06-29

    win8.1关机变重启怎么办?Win8.1点了关机键却重启的解决办法介绍

    最近小编的电脑关机的时候再点了“关机”按钮后就会自动重启,有时候更是无法关机,总是重启,令人抓狂。经过查询才知道和WIN8.1休眠有关,下面小编教大家三个方法来解决这个问题。一、关闭“快速启动&rdquo
    2022-06-04

    电脑无缘无故重启或关机的原因有哪些

    1. 过热:电脑内部的温度过高可能会导致电脑自动重启或关机,这通常是由于散热系统故障、灰尘堵塞或温度过高等原因引起的。2. 电源故障:电源故障可能会导致电脑突然关机或重启,这可能是由于电源供应不足、电源线松动或电源损坏等原因引起的。3. 内
    2023-05-31

    Linux怎么优雅的清理重复文件

    这篇“Linux怎么优雅的清理重复文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux怎么优雅的清理重复文件”文章吧
    2023-06-28

    腾讯云服务器怎么关机重启

    如果您使用的是腾讯云服务器,建议您先检查服务器是否正常运行,如果一切正常,那么可以尝试下面的方法:关闭服务器主机,重启:首先请确保将服务器主机关闭,然后再进行重启;检查服务器硬件设备:如果您使用的是腾讯云服务器,需要检查服务器硬件设备是否正常运行;清理服务器磁盘:检查服务器的磁盘空间是否足够,如果磁盘空间不足,需要清理;检查服务器系统和应用程序:如果服务器硬件设备正常,但应用程序无法正
    2023-10-26

    云服务器怎么关机重启不了

    如果您的云服务器无法关机或重启,您可以尝试以下步骤:确认重启选项是否正确:进入云服务器控制面板,找到”重置“选项。在重置选项中,选择“重启服务器到相同配置”。检查计算机的操作系统:如果计算机使用的是Windows系统,可以尝试查看计算机的用户手册,检查计算机使用的操作系统版本是否与云服务器的配置一致。确认计算机硬件设备是否正常:尝试检查计算机的硬件设备是否正常:比如:内存是否足够、硬盘是
    2023-10-26

    云服务器怎么关机重启系统

    云服务器的关机和重启可以使用系统自带的关机和重启功能来实现。下面是一个简单的示例:首先,登录云服务器的服务管理界面,输入你的用户名和密码,并点击“登录”按钮。如果你是第一次使用云服务器,需要设置默认账户,以保存之前的设置。接着,点击“高级设置”按钮,然后选择“关机重启”选项。在这个选项中,你可以选择重启服务器,或者关闭服务器,以便你重新启动云服务器。在“重启选项”下面,可以选择“重新启动服务
    2023-10-26

    win10电脑关机变重启怎么讲解

    win10电脑关机变重启怎么讲解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。很多时候会遇到你明明点击的是关机的按钮,结果,关机变成重启,这种情况应该怎么办呢?
    2023-06-27

    Linux关机重启的命令是什么

    本篇内容主要讲解“Linux关机重启的命令是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux关机重启的命令是什么”吧!1、shutdown命令使用它可以安全地关闭系统,然而在关闭系统
    2023-06-09

    华为云服务器怎么关机重启

    华为云服务器通常可以关闭和重启。以下是一些关闭和重启服务器的步骤:登录华为云服务器。在控制面板中,您可能会找到“关闭计算机”或“重启服务器”选项。在“关闭服务器”对话框中,选择“是”或“否”选项。在“设置”选项卡中,确保选择了“关闭服务器”。然后单击“确定”按钮,以关闭服务器并重启计算机。重启华为云服务器需要进行安全
    2023-10-26

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录