Open s5364733 opened 1 year ago
原代码运行抓包
从上面可以看出本地端口都使用不同链接,通过ACK确认TCP报文可以看出(58421,58425,58441)
去掉本地注册轮询之后抓包
很明显进行第一次尝试keepalive TCPack 之后 服务端会主动发送FIN SYN 包主动断开连接,
func (e *executor) registry() { t := time.NewTimer(time.Second * 0) //初始立即执行 defer t.Stop() req := &Registry{ RegistryGroup: "EXECUTOR", RegistryKey: e.opts.RegistryKey, RegistryValue: "http://" + e.address, } param, err := json.Marshal(req) if err != nil { log.Fatal("执行器注册信息解析失败:" + err.Error()) } for { <-t.C t.Reset(time.Second * time.Duration(20)) //20秒心跳防止过期 func() { result, err := e.post("/api/registry", string(param)) if err != nil { e.log.Error("执行器注册失败1:" + err.Error()) return } defer result.Body.Close() body, err := ioutil.ReadAll(result.Body) if err != nil { e.log.Error("执行器注册失败2:" + err.Error()) return } res := &res{} _ = json.Unmarshal(body, &res) if res.Code != SuccessCode { e.log.Error("执行器注册失败3:" + string(body)) return } e.log.Info("执行器注册成功:" + string(body)) }() } }
这个会处理吗?控制台一直打执行器注册成功的日志
原代码运行抓包
去掉本地注册轮询之后抓包
总结,虽然不确定为什么服务端会主动发送FIN 包 但是可以确定的是,轮询防止心跳过期代码并没有起到什么作用
代码如下: