golang gin框架使用endless实现热更新原理和操作步骤
最近在学习go的Gin Web Framework,其中一个知识点是:【优雅地重启或停止】,原文截图:
这里说的其中一个方法是使用【fvbock/endless】是实现,记录下自己的实操步骤!
Gin Web Framework文档地址:https://gin-gonic.com/zh-cn/docs/
fvbock/endless 仓库地址:https://github.com/fvbock/endless
我自己整理了一个步骤图如下:
下面是详细的步骤
1、main.go
1 package main 2 3 import ( 4 "gin_test/middleware" 5 "gin_test/router" 6 "github.com/fvbock/endless" 7 "github.com/gin-gonic/gin" 8 ) 9 10 /* 11 Gin Web Framework 12 官方文档:https://gin-gonic.com/zh-cn/docs/ 13 */ 14 15 func main() { 16 //开发环境 17 //gin.SetMode(gin.DebugMode) 18 19 // 强制日志颜色化 20 gin.ForceConsoleColor() 21 22 //线上环境 23 gin.SetMode(gin.ReleaseMode) 24 25 ginEngine := gin.Default() 26 27 ginEngine.Use( 28 //全局使用中间件 29 middleware.RequestBefore(0), 30 //自定义日志文件格式 31 middleware.LogDiy(), 32 ) 33 34 //设置路由 35 router.SetUrl(ginEngine) 36 37 //设置一个或多个信任的ip地址,否则会提示You trusted all proxies, this is NOT safe 38 ginEngine.SetTrustedProxies([]string{ 39 "127.0.0.1", 40 "192.168.1.200", 41 }) 42 43 //支持 Let's Encrypt 44 //log.Fatal(autotls.Run(ginEngine, "127.0.0.1:8000")) 45 46 //启动服务 47 //ginEngine.Run(":8000") 48 endless.ListenAndServe(":8000", ginEngine) 49 }
注意48行,要使用endless
2、router.go
1 func SetUrl(r *gin.Engine) { 2 r.GET("/endless", func(c *gin.Context) { 3 c.JSON(http.StatusOK, gin.H{ 4 "msg": "welcome to endless and test update", 5 "status": "200", 6 }) 7 }) 8 }
3、编译并执行
可以看到,进程ID = 3356644,监听端口:8000
4、测试访问
浏览器:
控制台:
5、修改源码,重新编译
1 func SetUrl(r *gin.Engine) { 2 r.GET("/endless", func(c *gin.Context) { 3 c.JSON(http.StatusOK, gin.H{ 4 "msg": "welcome to endless and test update", 5 "status": "200", 6 "data": "test_endless",//新加的 7 }) 8 }) 9 }
编译的时候,文件名和之前一样就行,可以看到,2个可执行文件的生成日期不一样
6、重新测试,这个时候内容还没有变化
浏览器:
控制台:
7、使用kill命令给老进程发送信号,这个是关键
1 kill -1 3356644 2 ps aux | grep "test_endless" | grep -v grep | awk '{print $2}' | xargs -i kill -1 {}
这里有2种方式去找到test_endless的PID,第一种呢是在知道PID的前提下去执行,第二种是根据进程名称去查找(推荐用这种,更灵活)
控制台执行一下第二种
这里发生了变化,流程如下:
A、老的进程收到信号
B、启动了一个新的进程,端口号还是8000,但是进程ID = 3413689
C、老进程不会处理新的连接了,但是会依然处理还没有处理完的老连接,直到所有老的连接都处理完,进程就会默默离开了
D、新的进程会处理新的连接
E、整个服务正常运行
8、再测试,可以看到,内容已经发生了变化,至此,整个更新流程完成
浏览器:
控制台: