/* 连接节点后,向节点介绍自己 */ func introduceSelf(session engine.Session) { //用代理方式查找最近的超级节点 nodeMsg := FindNode{ NodeId: session.GetName(), WantId: nodeStore.ParseId(nodeStore.GetRootIdInfoString()), IsProxy: true, ProxyId: nodeStore.GetRootIdInfoString(), IsSuper: nodeStore.Root.IsSuper, Addr: nodeStore.Root.Addr, TcpPort: nodeStore.Root.TcpPort, UdpPort: nodeStore.Root.UdpPort, } // resultBytes, _ := proto.Marshal(&nodeMsg) resultBytes, _ := json.Marshal(nodeMsg) session.Send(FindNodeNum, &resultBytes) }
//处理查找节点的请求 //本节点定期查询已知节点是否在线,更新节点信息 func read() { for { nodeIdStr := <-nodeStore.OutFindNode session, ok := engine.GetController().GetSession(nodeStore.SuperName) //root节点刚启动就没有超级节点 if !ok { continue } findNodeOne := &msg.FindNode{ NodeId: nodeStore.GetRootIdInfoString(), IsProxy: false, ProxyId: nodeStore.GetRootIdInfoString(), WantId: nodeIdStr, } /* 当查找id等于自己的时候: 超级节点:查找邻居节点 普通节点:查找离自己最近的超级节点,查找邻居节点做备用超级节点 */ if nodeIdStr == nodeStore.ParseId(nodeStore.GetRootIdInfoString()) { //普通节点查找最近的超级节点 if !nodeStore.Root.IsSuper { findNodeOne.NodeId = session.GetName() findNodeOne.IsProxy = true // findNodeOne.WantId = nodeIdStr findNodeOne.IsSuper = nodeStore.Root.IsSuper findNodeOne.Addr = nodeStore.Root.Addr findNodeOne.TcpPort = nodeStore.Root.TcpPort findNodeOne.UdpPort = nodeStore.Root.UdpPort resultBytes, _ := json.Marshal(findNodeOne) session.Send(msg.FindNodeNum, &resultBytes) findNodeOne.WantId = "left" findNodeBytes, _ := json.Marshal(findNodeOne) err := session.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } findNodeOne.WantId = "right" findNodeBytes, _ = json.Marshal(findNodeOne) err = session.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } continue } //先发送左邻居节点查找请求 findNodeOne.WantId = "left" id := nodeStore.GetLeftNode(*nodeStore.Root.IdInfo.GetBigIntId(), 1) if id == nil { continue } findNodeBytes, _ := json.Marshal(findNodeOne) ok := false var clientConn engine.Session if nodeStore.Root.IsSuper { clientConn, ok = engine.GetController().GetSession(string(id[0].IdInfo.Build())) } else { clientConn, ok = engine.GetController().GetSession(nodeStore.SuperName) } if !ok { continue } err := clientConn.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } //发送右邻居节点查找请求 findNodeOne.WantId = "right" id = nodeStore.GetRightNode(*nodeStore.Root.IdInfo.GetBigIntId(), 1) if id == nil { continue } findNodeBytes, _ = json.Marshal(findNodeOne) if nodeStore.Root.IsSuper { if clientConn, ok = engine.GetController().GetSession(string(id[0].IdInfo.Build())); !ok { continue } } err = clientConn.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } continue } //自己不是超级节点,就不需要保存逻辑节点 // if !nodeStore.Root.IsSuper { // continue // } //-------------------------------------------- // 查找普通节点,只有超级节点才需要查找 //-------------------------------------------- //这里临时加上去 //去掉后有性能问题 findNodeBytes, _ := json.Marshal(findNodeOne) remote := nodeStore.Get(nodeIdStr, false, "") if remote == nil { continue } session, _ = engine.GetController().GetSession(string(remote.IdInfo.Build())) if session == nil { continue } err := session.Send(msg.FindNodeNum, &findNodeBytes) if err != nil { fmt.Println("manager发送数据出错:", err.Error()) } } }