Go优雅的重启服务之endless库
本文主要介绍如何优雅的重启或平滑的重启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库相关推荐
- ShutdownHook - java中优雅地停止服务
1.什么是ShutdownHook 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源.平滑退出的功能. 使用Runtime.addShutdownHook(Thread hook)方法, ...
- 用 TypeScript 编写一个 React 服务端渲染库(1)
前言 代码都甩在 Github 上面了,欢迎随手 star ? 踩坑的过程大概都在 TypeScript + Webpack + Koa 搭建 React 服务端渲染 这篇文章里面 踩坑的 DEMO ...
- JDK ShutdownHook - 优雅地停止服务
一.什么是ShutdownHook? 在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源.平滑退出的功能. 使用Runtime.addShutdownHook(Thread hook)方 ...
- Vue项目开发中优雅的切换服务端ip
Vue项目开发中优雅的切换服务端ip 在进行Vue开发的时候,需要配置项目对应服务端的ip地址,但如果需要在多个服务端间进行切换,通常的做法是:手动修改vue.config.js配置文件中的服务端ip ...
- MySQL--忘记密码,重置密码重启服务密码失效(Windows)
一.问题说明 最近在Windows下操作mysql数据库,我装的是mysql5.7版本的,但是忘记了安装时设置的密码, 通过mysqld -nt --skip-grant-tables 跳过安全检查登 ...
- Nacos数据库配置更新需要重启服务
排查问题 线上环境报错,看报错信息可定位到是SQL语句有误. 但这段SQL在测试环境是没有问题的. 对比后发现是数据库配置 spring:dataSource:url: 的数据库链接后面要加 & ...
- Linux上重启服务的正确命令
在开发环境下,我们经常需要部署代码,重启服务,所以会把命令写在脚本中,方便使用. 我们可能这么写 #!/bin/bashps -ef | grep backend-api-1.0 | grep -v ...
- CentOS下配置VNCServer,重启服务仍然生效
CentOS下配置VNC Server,重启服务,配置仍然生效的方法: 本文前提:系统已安装好gnome桌面,如果没有请执行下面的命令安装即可. yum groupinstall "Desk ...
- linux vnc服务重启,CentOS下配置VNCServer,重启服务仍然生效
CentOS下配置VNC Server,重启服务,配置仍然生效的方法: 本文前提:系统已安装好gnome桌面,如果没有请执行下面的命令安装即可. yum groupinstall "Desk ...
- Redis的持久化开启了RDB和AOF下重启服务是如何加载的?(10个人9个回答错误)
互联网面试题更新了!随便呈上几道,看看大家能否答出来: redis为什么是key,value的,为什么不是支持SQL的? redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) r ...
最新文章
- 手写一个RPC框架,理解更透彻(附源码)
- android网络请求分析工具,android网络数据请求
- “双十一”背后,阿里的技术到底有多“牛”?
- python3.7.2安装步骤-python安装升级详细步骤 Python2 升级 Python3
- Java基础:参数是如何传递的
- V.Replication and Sharding(创建主从数据库)
- python安装BeautifulSoup注意事项
- 搭建appium的android环境
- [转]VSS(Visual SourceSafe)使用入门
- Windows下一个MySQL有些错误的解决方法
- Windows华丽变身MAC OS X
- html如何修改字体黑体,css如何设置黑体样式?
- 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。...
- 200万年薪请不到!清华姚班到底有多牛X?
- 安卓开发学习5-6:布局管理器:布局管理器嵌套
- 网页服务器怎么做链接,如何做网页超级链接
- Dota2世界冠军OG被AI碾压,全程人类只推掉两座外塔 | 广东省智能创新协会
- leetcode_Hamming Distance
- MiniSTM32F103实现家庭普通电路中的电流谐波检测
- 学习表——受任于败军之际,奉命于危难之间(12.5-12.11)
热门文章
- 扩展名是.ps的PostScript文件详解
- sql server2000安装quot;挂起quot;的解决方法
- amc 美国数学竞赛能用计算机吗,关于AMC美国数学竞赛的QA
- Openstack Cinder Ceph(RBD)备份恢复过程(backup/restore)
- 韩信点兵python算法_韩信点兵算法
- c++画蛋糕_生日蛋糕--C++
- 基于改进U-GAT-IT的人像手绘风格转换系统(源码&教程)
- 0字节文件无法删除怎么办
- ABO血型系统遗传规律表
- c语言switch例题注释,switch语句例子大全 C语言switch语句例题