前言

最近在写 go 的项目, http 用的 beego 框架. 因为 go 不想 php, 每次代码改动都需要重启服务, 所以代码发上线之后, 如何重启服务就成了一个问题. 如果强行重启的话, 不光在重启期间的所有访问都被拒绝了, 而且在杀掉进程的时候处理中的请求也挂了. 对于一个向用户正常提供服务的服务器来说, 这种情况自然时无法容忍的.

在我的设想中, 服务的重启应该是启动进程处理新的请求, 而老进程则等待将现有请求处理完再退出, 这样就可以无缝重启了.

想法是好的, 结果网上搜了半天, 都是针对 http 系统模块的, 没有找到 beego 的优雅重启. 但是我还很纳闷, 这么流行的框架, 竟然没有人写过? (当然, 后面完美的证明了我的愚蠢)

尝试

在我搜了半天没有找到的时候, 机智的我自然就要动手自己搞了.在我的设想中, 大概分为以下三步:

  1. 接收服务重启的命令
  2. 老进程停止接收请求并在现有请求处理完后退出
  3. 启动新进程处理新的请求

想法是好的, 接下来就是如何实现了, 一步一步来.

第一步很简单, 说白了就是如何向进程发送消息, 我尝试了修改本地文件, 也想过用消息队列, 不过最终还是选择了大多数人的选择, kill命令发送信号量.

准备开始第二步了, 这个时候就坑了. 首先, beego的运行只有一条命令beego.run(). 很显然, 它将http封装了起来, 所以要想在停止端口监听的同时, 进程继续处理现有请求, 只有两条路走. 一是beego有暴露的方法支持停止端口监听的操作. 二就是重写beego源码. 而重写源码就意味着之后就不能跟着版本进行更新了, 所以是下下策.

不管怎么说吧, 先对beego的启动机制有个了解是必要的. 就从run方法进去. 而就在我进入方法走了没两步, 看到了这样的代码:

看注释. 启动优雅模式. 这这这这, 这不就是我要的么?????? 这我整半天整了个毛啊, 人家一开始就支持. 尝试一下, 将值置为 true 试一下:

beego.BConfig.Listen.Graceful = true

那么问题来了, beego是如何接收信号的呢? 从下面调用的ListenAndServe 方法走进去. 找到启动信号监听的地方, 然后看一下监听的是哪个信号就可以了. 结果, 往里走了两个方法就找到了:

显然, 通过HUP信号会启动子进程来实现优雅重启, 而INT信号会令进程停止. 然后我验证了一下.

  1. beego运行前修改其配置: beego.BConfig.Listen.Graceful = true
  2. 通过kill -HUP pid命令重启.

简单试了一下, 确实实现了优雅重启. 原进程会在请求处理完之后停止.

另外, 也可以在app.cnf中通过配置来启动优雅重启:

Graceful=false

总结

最后, 我到google重新搜了一下: beego graceful. 结果发下其赫然躺在搜索结果的第一条. 我???

所以, 之后要尽量使用英文关键词搜索, 中文搜索有时定位不到准确的结果, 反而浪费了大量时间. 就比如这次, 如果最开始搜到了这条, 可能十几分钟就搞出来了. 偏偏最后我翻源码翻了几个小时, 得出的结论和那十几分钟的还是一样的. 好气呀.

谨以此记录我这被自己坑的一次.

beego 优雅重启相关推荐

  1. gin 优雅重启或停止

    gin 优雅重启或停止 想要优雅地重启或停止你的Web服务器,使用下面的方法 我们可以使用fvbock/endless来替换默认的ListenAndServe,有关详细信息,请参阅问题#296 rou ...

  2. linux 优雅重启进程,apache2 重启、停止、优雅重启、优雅停止

    停止或者重新启动apache有两种发送信号的方法 第一种方法: 直接使用linux的kill命令向运行中的进程发送信号.你也许你会注意到你的系统里运行着很多httpd进程.但你不应该直接对它们中的任何 ...

  3. plsql developer无监听程序_无停机优雅重启 Go 程序

    什么是优雅重启 在不停机的情况下,就地部署一个应用程序的新版本或者修改其配置的能力已经成为现代软件系统的标配.这篇文章讨论优雅重启一个应用的不同方法,并且提供一个功能独立的案例来深挖实现细节.如果你不 ...

  4. exec go 重启_无停机优雅重启 Go 程序

    什么是优雅重启 在不停机的情况下,就地部署一个应用程序的新版本或者修改其配置的能力已经成为现代软件系统的标配.这篇文章讨论优雅重启一个应用的不同方法,并且提供一个功能独立的案例来深挖实现细节.如果你不 ...

  5. golang服务开发平滑升级之优雅重启

    女主宣言 本文章主要探讨golang服务器开发中在平滑升级过程中对优雅重启的使用与研究. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算",点关注哦! 经典平滑升级方案 ...

  6. exec go 重启_[译]Golang中的优雅重启

    声明:本文目的仅仅作为个人mark,所以在翻译的过程中参杂了自己的思想甚至改变了部分内容,其中有下划线的文字为译者添加.但由于译者水平有限,所写文字或者代码可能会误导读者,如发现文章有问题,请尽快告知 ...

  7. golang 遍历list_golang服务开发平滑升级之优雅重启

    1 经典平滑升级方案 服务器开发运维中,平滑升级是一个老生常谈的话题.拿一个http server来说,最常见的方案就是在http server前面加挂一个lvs负载,通过健康检查接口决定负载的导入与 ...

  8. nginx与httpd 优雅重启

    前言:在工作当中,经常会遇到服务不能停止,但是新加了nginx或者httpd的主机配置,可以采用以下的语句做优雅重启. #nginx nginx -s reload 如果要在更改配置后刷新Nginx, ...

  9. Python:requests + bmc开机、关机、优雅重启、强制重启

    简介:BMC,执行伺服器远端管理控制器,英文全称为Baseboard Management Controller. 为基板管理控制器.它可以在机器未开机的状态下,对机器进行固件升级.查看机器设备.等一 ...

最新文章

  1. mysql常用linux命令大全_Linux-MySQL常用命令(示例代码)
  2. 无法启动程序,拒绝访问解决方法
  3. 无法解析的外部符号 WinMain,该符号在函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ) 中被引用
  4. linux系统格式化磁盘
  5. Ksusha and Array (vector)
  6. [转]Redhat EL5.4用CentOS源进行更新
  7. c++享元模式flyweight
  8. 【软件设计师】2020-08-07
  9. Codeforces 1291 Round #616 (Div. 2) C. Mind Control(超级详细)
  10. ANSYS 简支梁的约束
  11. 对学习java的心得体会1
  12. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验 1
  13. window 常用软件
  14. CCS 软件仿真 支持6678
  15. VMware16虚拟机:安装Windows10系统---超详细教程
  16. 将最新Chromium浏览器集成到.NET应用程序中
  17. server是什么意思
  18. 【多线程】long和double的非原子性协定
  19. window下Nexus私服高级搭建
  20. 查找字符串中某个字符出现的次数

热门文章

  1. 在电脑上显示未知发布者怎么办_电脑提示未知发布者 - 卡饭网
  2. java三级报名_java web 学习 --第四天(Java三级考试)
  3. mysql 字段a减字段b_SQL 数据库 如何实现第一行字段A减字段B得到值C,然后再用C减去第二行字段B,以此类推,求高手解答...
  4. Linux基本目录结构
  5. python定义test方法_向python/django失败的测试方法的详细信息中添加自定义/调试消息的任何方法unittest.TestCase?...
  6. vue修改计算属性的值_Vue语法高级之计算属性和侦听器
  7. python 找到两个排序数组的中位数_Python查找两个有序列表中位数的方法【基于归并算法】...
  8. docker portainer_「实战篇」开源项目docker化运维部署-Portainer管理集群部署(十)...
  9. java 168转换成861_java实验-java语言面向对象编程基础
  10. java密码框提示_[Java教程]如何实现在密码框如出现提示语