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][]string //map[masterNodeId]map[nodeId]struct{} bRetire bool isRegisterOk 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 { dc.funDelNode(nodeId) dc.removeMasterNode(req.MasterNodeId, nodeId) } //设置新结点 for _, nodeInfo := range mapNodeInfo { dc.addMasterNode(req.MasterNodeId, nodeInfo.NodeId,nodeInfo.PublicServiceList) bSet := dc.setNodeInfo(req.MasterNodeId,nodeInfo) if bSet == false { continue } } return nil } func (dc *OriginDiscoveryClient) OnNodeConnected(nodeId string) { dc.regServiceDiscover(nodeId) } func (dc *OriginDiscoveryClient) OnRelease(){ log.Debug("OriginDiscoveryClient") //取消注册 var nodeRetireReq rpc.UnRegServiceDiscoverReq nodeRetireReq.NodeId = cluster.GetLocalNodeInfo().NodeId masterNodeList := cluster.GetOriginDiscovery() for i:=0;i