gin 服务 无缝停启 更新服务

本贴最后更新于 2117 天前,其中的信息可能已经物是人非

原文链接 :https://juejin.im/post/5d2ed3776fb9a07edb397c77 (猜测)

  • 在 kill 服务时,使用 kill -12 **** 将服务停止。

  • 服务在收到信号量 12 (SIGUSR2) 后, 不再处理新请求,

  • 将已开始的请求处理完成,

  • 将 标准输出、错误输出 和 socket 的描述符转交给之后新启动的程序

  • 无缝启停完成

    例:kill -12 12345

package run import ( "context" "errors" "flag" "github.com/gin-gonic/gin" "log" "net" "net/http" "os" "os/exec" "os/signal" "syscall" "time" ) var ( listenerGin net.Listener = nil serverGin *http.Server = nil gracefulGin = flag.Bool("graceful", false, "listen on fd open 3(internal use only)") ) func GinRun(router *gin.Engine, port string) { var err error flag.Parse() serverGin = &http.Server{ Addr: port, Handler: router, } // 判断是否为 reload if *gracefulGin { log.Println("listening on the existing file descriptor 3") f := os.NewFile(3, "") // 获取 上个服务程序的 socket 的描述符 listenerGin, err = net.FileListener(f) } else { log.Println("listening on a new file descriptor") // 新建 listenerGin, err = net.Listen("tcp", serverGin.Addr) } if err != nil { log.Printf("listener error: %v\n", err) } go func() { // 开启服务 if err := serverGin.Serve(listenerGin); err != nil && err != http.ErrServerClosed { log.Printf("listen error:%v\n", err) } }() handleSig() log.Println("signal end") } func handleSig() { sign := make(chan os.Signal) signal.Notify(sign, syscall.SIGINT, syscall.SIGTERM, syscall.SIGUSR2) for { // 接收信号量 sig := <-sign log.Printf("signal receive: %v\n", sig) ctx, _ := context.WithTimeout(context.Background(), time.Second*10) switch sig { case syscall.SIGINT, syscall.SIGTERM: // 关闭服务 log.Println("shutdown") signal.Stop(sign) if err := serverGin.Shutdown(ctx); err != nil { log.Fatalf("[ service shutdown ] error:%v\n", err) } return case syscall.SIGUSR2: // 重启服务 log.Println("reload") // 先启动新服务 if err := reloadGin(); err != nil { log.Printf("[ service reload ] error: %v\n", err) continue } // 关闭旧服务 if err := serverGin.Shutdown(ctx); err != nil { log.Fatalf("[ service reload ] shutdown error:%v\n", err) } log.Println("[ service reload ] success") return } } } func reloadGin() error { tl, ok := listenerGin.(*net.TCPListener) if !ok { return errors.New("listener is not tcp listener") } f, err := tl.File() if err != nil { return err } // 命令行启动新程序 args := []string{"-graceful"} cmd := exec.Command(os.Args[0], args...) cmd.Stdout = os.Stdout // 1 cmd.Stderr = os.Stderr // 2 cmd.ExtraFiles = []*os.File{f} // 3 return cmd.Start() }

实例代码:demo.zip

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1396 回帖 • 249 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 36 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 40 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 55 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 10 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注
  • gRpc
    11 引用 • 9 回帖 • 101 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 246 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 68 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 1 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 755 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 1 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 7 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 9 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 313 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 6 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖