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" const RpcPingMethod = OriginDiscoveryMasterName+".RPC_Ping" const UnRegServiceDiscover = OriginDiscoveryMasterName+".RPC_UnRegServiceDiscover" type OriginDiscoveryMaster struct { service.Service mapNodeInfo map[string]struct{} nodeInfo []*rpc.NodeInfo nsTTL nodeSetTTL } 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) OnRelease(){ //取消注册 var nodeRetireReq rpc.UnRegServiceDiscoverReq nodeRetireReq.NodeId = cluster.GetLocalNodeInfo().NodeId masterNodeList := cluster.GetOriginDiscovery() for i:=0;i