Gin如何使用endless平滑重启? 文章 2021-09-03 15:08:09 +0800 CST 阅读:3661 评论数:0 [TOCM] [TOC] # 前言 由于前几天写了一个练手项目(就是现在看到的博客)已经更新到服务器上了,由于时常对代码进行优化,每次改了代码我都需要`kill` 掉运行的服务(此时服务停止,网站就G了,很影响体验),编译之后再启动,那么就试想GO有没有平滑重启服务的包或者函数呢? ## 对用户必须要满足 - 正在浏览,不能突然久打不开了 - 提交数据没办法提交了 - 总之重启不能影响用户体验 ## 服务端只要要满足 - 不关闭现有连接(正在运行中的程序) - 新的进程启动并替代旧进程 - 新的进程接管新的连接 - 连接要随时响应用户的请求,当用户仍在请求旧进程时要保持连接,新用户应请求新进程,不可以出现拒绝请求的情况 然后就大概搜了下有不少方法,我使用了一个叫做`endless`的包。 ## 演示  在这个演示中我们做了哪些操作呢? - 首先编译程序 - 运行程序看到输出aaa - 再然后修改程序为bbb - 重新编译 - 找到pid进程号,执行信号(程序监听到信号为:`sigup` 进行平滑启动) - 结果平滑启动成功,不会中断程序,用户访问正常,并且修改代码成功输出bbb # endless > Zero downtime restarts for golang HTTP and HTTPS servers. (for golang 1.3+) 传送地址 > https://github.com/fvbock/endless#hammer-time 这里对它有详细的说明和使用方法。也对监听信号做了详细的说明。 ## endless的使用 ### 安装 ```go go get -v https://github.com/fvbock/endless ``` ### gin 中使用代码实例 ```go package main import ( "github.com/fvbock/endless" "github.com/gin-gonic/gin" "log" ) func main() { gin.SetMode(gin.ReleaseMode) r := setRouter() if err := endless.ListenAndServe(":9090",r); err != nil{ log.Fatalf("listen: %s\n", err) } } func setRouter() * gin.Engine{ r := gin.Default() r.GET("/", func(context *gin.Context) { context.String(200,"hello world AAA!") }) return r } ``` ### 编译 ```go go build -o sig ``` ### 运行 ```go ./sig ``` ### 访问 > http://127.0.0.1:9090/ 输出的结果为:hello world AAA! ## 测试平滑重启 ### 更改返回值 ```go func setRouter() * gin.Engine{ r := gin.Default() r.GET("/", func(context *gin.Context) { context.String(200,"hello world 2BBB!") }) return r } ``` ### 重新编译 ```go go build -o sig ``` ### 重启服务 ``` #找到pid ps aux| grep sig kill -1 71104 ``` > 官方上有说明 `SIGHUP` 将触fork/restar **其他信号可以在官方上看到** ### 执行结果 ``` 2021/09/03 14:39:17 71104 Received SIGHUP. forking. 2021/09/03 14:39:18 71257 :9090 2021/09/03 14:39:18 71104 Received SIGTERM. 2021/09/03 14:39:18 71104 [::]:9090 Listener closed. 2021/09/03 14:39:18 71104 Waiting for connections to finish... 2021/09/03 14:39:18 71104 Serve() returning... 2021/09/03 14:39:18 listen: accept tcp [::]:9090: use of closed network connection ``` ### 刷新浏览器 > http://127.0.0.1:9090 输出的结果为:hello world BBB! # 总结 这样就完成了平滑启动,再也不用先`kill`再`star`了,世界都宁静了。 使用 `endless` 貌似挺简单,我大概研究了下源码,but,道行还是太浅,不太看得懂,接下来准备啃一下go 网络编程的基础支持,然后再回来研究下 `endless`源码。