Gin IdleTimeout本地验证

启动两个服务,验证网络连接

第一个服务 sv-1 的代码,虽然整体代码看起来多,但核心代码也就几行。主要看 GET 请求,它做了一个 Proxy 处理

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "net/http"
    "net/http/httputil"
    "time"
)

func FirstMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()
        if c.Writer.Size() <= 0 {
            fmt.Println("response size:", c.Writer.Size(), time.Now().Format("2006-01-02 15:04:05"))
        }
    }
}

func main() {
    router := gin.New()
    router.Use(FirstMiddleware())

    router.GET("/proxy", func(c *gin.Context) {
        director := func(req *http.Request) {
            req.URL.Scheme = "http"
            req.URL.Host = "127.0.0.1:8009"
            req.Host = "127.0.0.1"
            req.URL.Path = "/gently"
        }
        proxy := &httputil.ReverseProxy{Director: director}
        proxy.ServeHTTP(c.Writer, c.Request)
    })

    router.Run(":8001")
}

接着是第二个服务 sv-2,上一个服务的 /proxy 请求会被转发到这个服务的 /gently 请求。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
    "time"
)

func main() {
    router := gin.Default()

    router.GET("/gently", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"name": "neo"})
    })

    server := http.Server{
        Addr:         ":8009",
        WriteTimeout: time.Second * 60,
        ReadTimeout:  time.Second * 60,
        IdleTimeout:  time.Second * 30,
        Handler:      router,
    }

    server.ListenAndServe()
}

两个服务启动 Http Sever 的方式是有差别的,我发现这个差别的影响还是很大的。我通过浏览器请求 sv-2 观察一下数据包的情况:
Gin IdleTimeout本地验证
符合预期,sv-2 设置的空闲时间是 30s,然后在 sv-2 发送了一个心跳包之后,8009 主动断开了连接。

我把空闲连接的设置注释掉,根据之前的了解,如果不明确指定 IdleTimeout 的话,程序会使用 ReadTimeout 连接需要在 60s 后断开连接。

Gin IdleTimeout本地验证
实验结果也符合预期。如果这个符合预期话,之前的验证就存在问题了

上一篇:linux性能资源分析工具


下一篇:基于Gin+Gorm框架搭建MVC模式的Go语言后端系统