golang gin框架使用endless实现热更新原理和操作步骤

发布时间 2023-10-31 16:36:18作者: 第一夫人

最近在学习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、再测试,可以看到,内容已经发生了变化,至此,整个更新流程完成

浏览器:

 控制台: