package cluster import ( "errors" "github.com/duanhf2012/origin/v2/log" "github.com/duanhf2012/origin/v2/rpc" "github.com/duanhf2012/origin/v2/service" "time" "github.com/duanhf2012/origin/v2/util/timer" "google.golang.org/protobuf/proto" ) const DynamicDiscoveryMasterName = "DiscoveryMaster" const DynamicDiscoveryClientName = "DiscoveryClient" const RegServiceDiscover = DynamicDiscoveryMasterName + ".RPC_RegServiceDiscover" const SubServiceDiscover = DynamicDiscoveryClientName + ".RPC_SubServiceDiscover" const AddSubServiceDiscover = DynamicDiscoveryMasterName + ".RPC_AddSubServiceDiscover" const NodeRetireRpcMethod = DynamicDiscoveryMasterName+".RPC_NodeRetire" type DynamicDiscoveryMaster struct { service.Service mapNodeInfo map[int32]struct{} nodeInfo []*rpc.NodeInfo } type DynamicDiscoveryClient struct { service.Service funDelService FunDelNode funSetService FunSetNodeInfo localNodeId int mapDiscovery map[int32]map[int32]struct{} //map[masterNodeId]map[nodeId]struct{} bRetire bool } var masterService DynamicDiscoveryMaster var clientService DynamicDiscoveryClient func getDynamicDiscovery() IServiceDiscovery { return &clientService } func init() { masterService.SetName(DynamicDiscoveryMasterName) clientService.SetName(DynamicDiscoveryClientName) } func (ds *DynamicDiscoveryMaster) isRegNode(nodeId int32) bool { _, ok := ds.mapNodeInfo[nodeId] return ok } func (ds *DynamicDiscoveryMaster) 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 > 0 && req.DelNodeId != int32(dc.localNodeId) { willDelNodeId = append(willDelNodeId, req.DelNodeId) } //删除不必要的结点 for _, nodeId := range willDelNodeId { cluster.TriggerDiscoveryEvent(false,int(nodeId),nil) dc.removeMasterNode(req.MasterNodeId, int32(nodeId)) if dc.findNodeId(nodeId) == false { dc.funDelService(int(nodeId), false) } } //设置新结点 for _, nodeInfo := range mapNodeInfo { bSet := dc.setNodeInfo(req.MasterNodeId,nodeInfo) if bSet == false { continue } cluster.TriggerDiscoveryEvent(true,int(nodeInfo.NodeId),nodeInfo.PublicServiceList) } return nil } func (dc *DynamicDiscoveryClient) isDiscoverNode(nodeId int) bool { for i := 0; i < len(cluster.masterDiscoveryNodeList); i++ { if cluster.masterDiscoveryNodeList[i].NodeId == nodeId { return true } } return false } func (dc *DynamicDiscoveryClient) OnNodeConnected(nodeId int) { dc.regServiceDiscover(nodeId) } func (dc *DynamicDiscoveryClient) OnRetire(){ dc.bRetire = true masterNodeList := cluster.GetDiscoveryNodeList() for i:=0;i