package cluster import ( "errors" "github.com/duanhf2012/origin/v2/log" "github.com/duanhf2012/origin/v2/rpc" "github.com/duanhf2012/origin/v2/service" "github.com/duanhf2012/origin/v2/util/timer" "google.golang.org/protobuf/proto" "time" ) const OriginDiscoveryMasterName = "DiscoveryMaster" const OriginDiscoveryClientName = "DiscoveryClient" const RegServiceDiscover = OriginDiscoveryMasterName + ".RPC_RegServiceDiscover" const SubServiceDiscover = OriginDiscoveryClientName + ".RPC_SubServiceDiscover" const AddSubServiceDiscover = OriginDiscoveryMasterName + ".RPC_AddSubServiceDiscover" const NodeRetireRpcMethod = OriginDiscoveryMasterName+".RPC_NodeRetire" // //type nodeTTL struct { // nodeId string // refreshTime time.Time //} // //type nodeSetTTL struct { // l *list.List // mapElement map[string]*list.Element // ttl time.Duration //} // //func (ns *nodeSetTTL) init(ttl time.Duration) { // ns.ttl = ttl // ns.mapElement = make(map[string]*list.Element,32) // ns.l = list.New() //} // //func (ns *nodeSetTTL) removeNode(nodeId string) { // ele,ok:=ns.mapElement[nodeId] // if ok == false { // return // } // // ns.l.Remove(ele) // delete(ns.mapElement,nodeId) //} // //func (ns *nodeSetTTL) addAndRefreshNode(nodeId string){ // ele,ok:=ns.mapElement[nodeId] // if ok == false { // ele = ns.l.PushBack(nodeId) // ele.Value = &nodeTTL{nodeId,time.Now()} // ns.mapElement[nodeId] = ele // return // } // // ele.Value.(*nodeTTL).refreshTime = time.Now() // ns.l.MoveToBack(ele) //} // //func (ns *nodeSetTTL) checkTTL(cb func(nodeIdList []string)){ // nodeIdList := []string{} // for{ // f := ns.l.Front() // if f == nil { // break // } // // nt := f.Value.(*nodeTTL) // if time.Now().Sub(nt.refreshTime) > ns.ttl { // nodeIdList = append(nodeIdList,nt.nodeId) // }else{ // break // } // // //删除结点 // ns.l.Remove(f) // delete(ns.mapElement,nt.nodeId) // } // // if len(nodeIdList) >0 { // cb(nodeIdList) // } //} type OriginDiscoveryMaster struct { service.Service mapNodeInfo map[string]struct{} nodeInfo []*rpc.NodeInfo } type OriginDiscoveryClient struct { service.Service funDelNode FunDelNode funSetNode FunSetNode localNodeId string mapDiscovery map[string]map[string]struct{} //map[masterNodeId]map[nodeId]struct{} mapMasterNetwork map[string]string bRetire bool } var masterService OriginDiscoveryMaster var clientService OriginDiscoveryClient func getOriginDiscovery() IServiceDiscovery { return &clientService } func init() { masterService.SetName(OriginDiscoveryMasterName) clientService.SetName(OriginDiscoveryClientName) } func (ds *OriginDiscoveryMaster) isRegNode(nodeId string) bool { _, ok := ds.mapNodeInfo[nodeId] return ok } func (ds *OriginDiscoveryMaster) updateNodeInfo(nInfo *rpc.NodeInfo) { if _,ok:= ds.mapNodeInfo[nInfo.NodeId];ok == false { return } nodeInfo := proto.Clone(nInfo).(*rpc.NodeInfo) for i:=0;i 0 { willDelNodeId = append(willDelNodeId, diffNode...) } } //指定删除结点 if req.DelNodeId != rpc.NodeIdNull && req.DelNodeId != dc.localNodeId { willDelNodeId = append(willDelNodeId, req.DelNodeId) } //删除不必要的结点 for _, nodeId := range willDelNodeId { cluster.TriggerDiscoveryEvent(false,nodeId,nil) dc.removeMasterNode(req.MasterNodeId, nodeId) if dc.findNodeId(nodeId) == false { dc.funDelNode(nodeId, false) } } //设置新结点 for _, nodeInfo := range mapNodeInfo { bSet := dc.setNodeInfo(req.MasterNodeId,nodeInfo) if bSet == false { continue } cluster.TriggerDiscoveryEvent(true,nodeInfo.NodeId,nodeInfo.PublicServiceList) } return nil } func (dc *OriginDiscoveryClient) OnNodeConnected(nodeId string) { dc.regServiceDiscover(nodeId) } func (dc *OriginDiscoveryClient) OnRetire(){ dc.bRetire = true masterNodeList := cluster.GetOriginDiscovery() for i:=0;i