golang平滑升级服务

不中断服务进行服务升级

最近在学习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
2
3
4
5
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Welcome Gin Server")
})
gracehttp.Serve(&http.Server{Addr:":8080",Handler:router})

v2

1
2
3
4
5
router := gin.Default()
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Welcome Gin New Server")
})
gracehttp.Serve(&http.Server{Addr:":8080",Handler:router})

如果是在windows环境下开发,会提示:

1
github.com\facebookgo\grace\gracehttp\http.go:104:53: undefined: syscall.SIGUSR2

貌似是因为grace不支持windows的原因,我们可以暂时不用搭理他,先编译一个二进制文件,

1
2
3
SET GOARCH=amd64
SET GOOS=linux
go build main.go

把生成好的文件复制到linux上,先启动起来(我是用的nohup ./grace &来启动的),这时候我们查看pid是多少

1
2
3
4
ps -ef|grep grace

root 11915 11364 0 13:06 pts/0 00:00:00 ./grace
root 11921 11364 0 13:08 pts/0 00:00:00 grep --color=auto grace

此时访问服务结果:
web1
这时候,我们把之前的文件备份,将v2的代码编译好并拷贝上去,执行命令

1
2
3
4
5
6
kill -USR2 11915
这时候在看看应用进程
ps -ef|grep grace

root 11928 1 0 13:11 pts/0 00:00:00 ./grace
root 11935 11364 0 13:12 pts/0 00:00:00 grep --color=auto grace

pid已经变为11928,此时访问服务结果:
web2
[参考]
https://github.com/facebookarchive/grace
https://github.com/gin-gonic/gin

You forgot to set the qrcode for Alipay. Please set it in _config.yml.
You forgot to set the qrcode for Wechat. Please set it in _config.yml.
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×