在实际的web运行中,加入一个服务正在接收大量的外部请求,但是此时又要涉及到停机升级,此时是不是会发生一些状况,比如:某个用户正在请求某个接口,保存一些重要的信息,此时后台给kill掉了此进程,那么当前用户正在保存的数据是不是要丢失?所以我们在实际的情况中需要对服务进行优雅停机,也就是当出现kill的时候,当前服务马上停止接收新的请求,并且留一些时间给当前正在处理的线程做任务的执行。
所以对于web项目来说,优雅停机是非常重要的事情。
在gin框架实现的web中如何进行优雅停机呢?这里主要使用到github.com/fvbock/endless框架进行处理,所以执行的步骤如下:
一、安装github.com/fvbock/endless依赖
首先对endless依赖进行安装,执行如下的命令:
go get -u github.com/fvbock/endless
这里我已经安装过了,所以没有安装过程的截图。
二、修改服务监听
在之前使用gin框架的时候,我们在main函数里面使用
r.Run(":48080")
方法进行端口监听,如下图:
这里我们把它替换成:
endless.ListenAndServe(":48080", r)
如下图:
启动之后,我们仍然可以正常请求服务信息。此时我们把服务给kill掉之后,可以看到控制台有signal输出:
这里主要就是给各个正在执行的线程留一些时间进行处理。从而实现优雅的停机了。
备注:
1、在windows上使用endless,会报错,例如:
endless.go:224: undefined: syscall.Kill
这样一大堆的错误,这是因为windows系统不支持一些signal,解决办法如下:
1)找到本机安装的go环境的根目录
2)进入到${GO_HOME}\src\syscall文件夹下,找到types_windows.go文件,用文件编辑器打开。
3)搜索signals关键词(大约在第68行左右),找到如下的代码:
在最后添加上:
16: "SIGUSR1", 17: "SIGUSR2", 18: "SIGTSTP",
4)接着把types_windows.go文件拖到底,添加上如下的代码:
func Kill(...interface{}) { return; } const ( SIGUSR1 = Signal(0x10) SIGUSR2 = Signal(0x11) SIGTSTP = Signal(0x12) )
5)重新编译项目代码,就不会报错了。
2、这里的endless框架主要是用接收signal的方式来完成信号的监听,从而进行优雅的停机操作。
最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...