不中断服务进行服务升级
最近在学习go语言,想着用gin+gorm来做一个微信小程序,在gin的github中看到了如何优雅的重启或者停止,因为在生产项目中,如果强行kill掉的话会造成正在执行的业务中断、用户访问被拒绝。显然,平滑的重启或升级我们的应用是多么的重要。
.net的发布过程
我做了很多年的.net ,但是从来没有想过如何去平滑更新服务端,也是因为业务要求的可用性不高。一般发布新版本都是采用最笨拙的方式,就是发通知(xx时间升级会暂停服务)->到点停止服务备份、copy新文件->启动服务。
java的发布过程
在用java做项目的时候,当时就用到了nginx中的upstream来负载均衡,当然,这时候要求的可用性较高,所以在发布服务的时候,就不能再采用简单粗暴的停止-启动大法。我们可以配合nginx -s reload来实现后端服务的灰度发布并且让用户无感知。
golang的发布过程
Graceful restart or stop
golang中有很多开源的解决方案:
endless
grace
overseer
实践出真知
在这里我们来试试grace(star最多,commits最多),在github上面有详细的demo和测试步骤。
v1
1 | router := gin.Default() |
v2
1 | router := gin.Default() |
如果是在windows环境下开发,会提示:
1 | github.com\facebookgo\grace\gracehttp\http.go:104:53: undefined: syscall.SIGUSR2 |
貌似是因为grace不支持windows的原因,我们可以暂时不用搭理他,先编译一个二进制文件,
1 | SET GOARCH=amd64 |
把生成好的文件复制到linux上,先启动起来(我是用的nohup ./grace &来启动的),这时候我们查看pid是多少
1 | ps -ef|grep grace |
此时访问服务结果:
这时候,我们把之前的文件备份,将v2的代码编译好并拷贝上去,执行命令
1 | kill -USR2 11915 |
pid已经变为11928,此时访问服务结果:
[参考]
https://github.com/facebookarchive/grace
https://github.com/gin-gonic/gin