Golang是一种与C语言类似的编译型语言,这意味着如果我们修改了代码就需要重新编译部署,但在很多大型系统中停止服务就意味着损失大笔的收入,破坏完美的用户体验。goGrace就是为解决这个问题而开发的。
我们通常会这样实现一个Golang的HTTP服务
package main
import (
“fmt”
“log”
“net/http”
“os”
“strconv”
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, “Welcome to the home page!”+strconv.Itoa(os.Getpid()))
})
err := http.ListenAndServe(":6086", nil)
if err != nil {
log.Println(err)
}
}
goGrace提供了非常简单的方式使您的HTTP服务几乎不需要修改就能支持平滑重启,您需要做的只有如下三步:
Step1:
在命令行执行goGrace安装命令
package main
import (
“fmt”
“log”
“net/http”
“strconv”
“github.com/pantsing/gograce/ghttp” // Step2: 导入goGrace的Pacekage
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, “Welcome to the home page!”+strconv.Itoa(os.Getpid()))
})
// Step3: 是的,将http改为ghttp
err := ghttp.ListenAndServe(":6086", nil)
if err != nil {
log.Println(err)
}
}
It’s so easy, right?! 你现在就可以通过向服务进程发送SIGHUP信号平滑重启服务了,或者发送SIGQUIT信号平滑退出。当收到退出信号后默认的等待请求执行完毕关闭connection退出的时间是60秒,您可以在服务启动前通过ghttp.SetListenerCloseTimeout(second int64)函数设置等待时间。或者如果您实例化了GraceServer对象,也可以直接设置其ListenerCloseTimeout属性。
目前goGrace只支持HTTP服务,之后还将会扩展到TCP服务。