启动两个服务,验证网络连接
第一个服务 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 观察一下数据包的情况:
符合预期,sv-2 设置的空闲时间是 30s,然后在 sv-2 发送了一个心跳包之后,8009 主动断开了连接。
我把空闲连接的设置注释掉,根据之前的了解,如果不明确指定 IdleTimeout 的话,程序会使用 ReadTimeout 连接需要在 60s 后断开连接。
实验结果也符合预期。如果这个符合预期话,之前的验证就存在问题了