本文主要介绍如何优雅的重启或平滑的重启Golang服务,在这里用到的就是endless。

完整库路径是:github.com/fvbock/endless

一、应用场景

每次修改完Go程序需要重新编译然后发布到服务器上,那么重启服务时应该怎么做,如果终止以前的进程,在重新启动,在这个时间间隔里服务是不可用的,这样是不能接受的。那么用两台服务器轮流重启,先重启一台后再重启另外一台,这样服务就一直是可用的,但是这样也有问题,就是你强制终止旧的进程,旧的进程在执行过程中中断,导致数据出现错误,这样也是不能的接收的。

我们要做到的优雅重启要做到:

1. 不中断正在执行中的程序

2. 服务始终保持可用

3. 旧的进程处理完后自动退出,新的请求过来由新的进程处理

二、实验过程

1. 第一次请求的代码

package mainimport ("github.com/fvbock/endless""github.com/gin-gonic/gin""time"
)func main() {r := gin.Default()r.GET("/test", handler)s := endless.NewServer(":8081", r)s.ReadHeaderTimeout = 3 * 60 * time.Seconds.WriteTimeout = 3 * 60 * time.Seconds.MaxHeaderBytes = 1 << 20s.ListenAndServe()
}func handler(c *gin.Context) {//第一次请求中休眠2分钟再返回 给操作留下足够时间time.Sleep(time.Second * 60 * 2)c.JSON(200, gin.H{"p": "第一次请求"})
}

2. 编译代码并执行

go build -o endless./endless &

3. 查看此时的进程ID为38911

4. 发起第一次请求会等待2分钟后返回

curl 'http://127.0.0.1:8081/test'

5. 此时修改代码并且编译好

package mainimport ("github.com/fvbock/endless""github.com/gin-gonic/gin""time"
)func main() {r := gin.Default()r.GET("/test", handler)s := endless.NewServer(":8081", r)s.ReadHeaderTimeout = 3 * 60 * time.Seconds.WriteTimeout = 3 * 60 * time.Seconds.MaxHeaderBytes = 1 << 20s.ListenAndServe()
}func handler(c *gin.Context) {//第一次请求中休眠2分钟再返回 给操作留下足够时间//time.Sleep(time.Second * 60 * 2)c.JSON(200, gin.H{"p": "第二次请求"})
}

6. 重启服务

kill -1 38911

7. 发起第二次请求直接返回了结果

8. 查看endless已经启动了两个进程

其中38911为旧的正在处理第一次请求

39965为新的服务会处理新的请求

9. 2分钟后第一次请求返回了结果

10. 此时再次查看进程就剩下一个新的进程了

这样就完美实现了服务的优雅重启,并且不会中断服务,也不会影响重启前正在执行的请求。

回过头来我们服务的启动和重启过程

第一次启动 pid=38911 端口=8081

执行kill -1 38911重启服务,39965为新启动的服务,最后38911关闭。

注:个人的理解有限,如果有不正确的地方欢迎大家指正讨论。

Go优雅的重启服务之endless库相关推荐

  1. ShutdownHook - java中优雅地停止服务

    1.什么是ShutdownHook 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源.平滑退出的功能. 使用Runtime.addShutdownHook(Thread hook)方法, ...

  2. 用 TypeScript 编写一个 React 服务端渲染库(1)

    前言 代码都甩在 Github 上面了,欢迎随手 star ? 踩坑的过程大概都在 TypeScript + Webpack + Koa 搭建 React 服务端渲染 这篇文章里面 踩坑的 DEMO ...

  3. JDK ShutdownHook - 优雅地停止服务

    一.什么是ShutdownHook? 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源.平滑退出的功能.  使用Runtime.addShutdownHook(Thread hook)方 ...

  4. Vue项目开发中优雅的切换服务端ip

    Vue项目开发中优雅的切换服务端ip 在进行Vue开发的时候,需要配置项目对应服务端的ip地址,但如果需要在多个服务端间进行切换,通常的做法是:手动修改vue.config.js配置文件中的服务端ip ...

  5. MySQL--忘记密码,重置密码重启服务密码失效(Windows)

    一.问题说明 最近在Windows下操作mysql数据库,我装的是mysql5.7版本的,但是忘记了安装时设置的密码, 通过mysqld -nt --skip-grant-tables 跳过安全检查登 ...

  6. Nacos数据库配置更新需要重启服务

    排查问题 线上环境报错,看报错信息可定位到是SQL语句有误. 但这段SQL在测试环境是没有问题的. 对比后发现是数据库配置 spring:dataSource:url: 的数据库链接后面要加 & ...

  7. Linux上重启服务的正确命令

    在开发环境下,我们经常需要部署代码,重启服务,所以会把命令写在脚本中,方便使用. 我们可能这么写 #!/bin/bashps -ef | grep backend-api-1.0 | grep -v ...

  8. CentOS下配置VNCServer,重启服务仍然生效

    CentOS下配置VNC Server,重启服务,配置仍然生效的方法: 本文前提:系统已安装好gnome桌面,如果没有请执行下面的命令安装即可. yum groupinstall "Desk ...

  9. linux vnc服务重启,CentOS下配置VNCServer,重启服务仍然生效

    CentOS下配置VNC Server,重启服务,配置仍然生效的方法: 本文前提:系统已安装好gnome桌面,如果没有请执行下面的命令安装即可. yum groupinstall "Desk ...

  10. Redis的持久化开启了RDB和AOF下重启服务是如何加载的?(10个人9个回答错误)

    互联网面试题更新了!随便呈上几道,看看大家能否答出来: redis为什么是key,value的,为什么不是支持SQL的? redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) r ...

最新文章

  1. 手写一个RPC框架,理解更透彻(附源码)
  2. android网络请求分析工具,android网络数据请求
  3. “双十一”背后,阿里的技术到底有多“牛”?
  4. python3.7.2安装步骤-python安装升级详细步骤 Python2 升级 Python3
  5. Java基础:参数是如何传递的
  6. V.Replication and Sharding(创建主从数据库)
  7. python安装BeautifulSoup注意事项
  8. 搭建appium的android环境
  9. [转]VSS(Visual SourceSafe)使用入门
  10. Windows下一个MySQL有些错误的解决方法
  11. Windows华丽变身MAC OS X
  12. html如何修改字体黑体,css如何设置黑体样式?
  13. 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。...
  14. 200万年薪请不到!清华姚班到底有多牛X?
  15. 安卓开发学习5-6:布局管理器:布局管理器嵌套
  16. 网页服务器怎么做链接,如何做网页超级链接
  17. Dota2世界冠军OG被AI碾压,全程人类只推掉两座外塔 | 广东省智能创新协会
  18. leetcode_Hamming Distance
  19. MiniSTM32F103实现家庭普通电路中的电流谐波检测
  20. 学习表——受任于败军之际,奉命于危难之间(12.5-12.11)

热门文章

  1. 扩展名是.ps的PostScript文件详解
  2. sql server2000安装quot;挂起quot;的解决方法
  3. amc 美国数学竞赛能用计算机吗,关于AMC美国数学竞赛的QA
  4. Openstack Cinder Ceph(RBD)备份恢复过程(backup/restore)
  5. 韩信点兵python算法_韩信点兵算法
  6. c++画蛋糕_生日蛋糕--C++
  7. 基于改进U-GAT-IT的人像手绘风格转换系统(源码&教程)
  8. 0字节文件无法删除怎么办
  9. ABO血型系统遗传规律表
  10. c语言switch例题注释,switch语句例子大全 C语言switch语句例题