增加邻居master服务发现功能

This commit is contained in:
boyce
2021-05-07 15:22:54 +08:00
parent bbab004f65
commit 212798dc04
6 changed files with 211 additions and 171 deletions

View File

@@ -27,6 +27,7 @@ type NodeInfo struct {
ServiceList []string //所有的服务列表 ServiceList []string //所有的服务列表
PublicServiceList []string //对外公开的服务列表 PublicServiceList []string //对外公开的服务列表
DiscoveryService []string //筛选发现的服务,如果不配置,不进行筛选 DiscoveryService []string //筛选发现的服务,如果不配置,不进行筛选
NeighborService []string
status NodeStatus status NodeStatus
} }
@@ -37,8 +38,8 @@ type NodeRpcInfo struct {
var cluster Cluster var cluster Cluster
type Cluster struct { type Cluster struct {
localNodeInfo NodeInfo //本结点配置信息 localNodeInfo NodeInfo //本结点配置信息
discoveryNodeList []NodeInfo //配置发现Master结点 masterDiscoveryNodeList []NodeInfo //配置发现Master结点
localServiceCfg map[string]interface{} //map[serviceName]配置数据* localServiceCfg map[string]interface{} //map[serviceName]配置数据*
mapRpc map[int] NodeRpcInfo //nodeId mapRpc map[int] NodeRpcInfo //nodeId
@@ -84,6 +85,10 @@ func (cls *Cluster) DiscardNode(nodeId int){
} }
func (cls *Cluster) DelNode(nodeId int,immediately bool){ func (cls *Cluster) DelNode(nodeId int,immediately bool){
//不删除
if cls.GetMasterDiscoveryNodeInfo(nodeId)!=nil || nodeId == cls.localNodeInfo.NodeId {
return
}
cls.locker.Lock() cls.locker.Lock()
nodeInfo,ok := cls.mapIdNode[nodeId] nodeInfo,ok := cls.mapIdNode[nodeId]
if ok == false { if ok == false {
@@ -104,6 +109,7 @@ func (cls *Cluster) DelNode(nodeId int,immediately bool){
nodeInfo.status = Discard nodeInfo.status = Discard
rpc.client.Unlock() rpc.client.Unlock()
cls.locker.Unlock() cls.locker.Unlock()
log.Release("Discard node %d %s",nodeInfo.NodeId,nodeInfo.ListenAddr)
return return
} }
rpc.client.Unlock() rpc.client.Unlock()
@@ -120,6 +126,8 @@ func (cls *Cluster) DelNode(nodeId int,immediately bool){
if ok == true { if ok == true {
rpc.client.Close(false) rpc.client.Close(false)
} }
log.Release("remove node %d %s",nodeInfo.NodeId,nodeInfo.ListenAddr)
} }
func (cls *Cluster) serviceDiscoveryDelNode (nodeId int,immediately bool){ func (cls *Cluster) serviceDiscoveryDelNode (nodeId int,immediately bool){
@@ -175,7 +183,8 @@ func (cls *Cluster) serviceDiscoverySetNodeInfo (nodeInfo *NodeInfo){
} }
cls.mapIdNode[nodeInfo.NodeId] = *nodeInfo cls.mapIdNode[nodeInfo.NodeId] = *nodeInfo
log.Debug("Discovery nodeId: %d discovery service:%+v",nodeInfo.NodeId,nodeInfo.PublicServiceList) log.Release("Discovery nodeId: %d services:%+v",nodeInfo.NodeId,nodeInfo.PublicServiceList)
//已经存在连接,则不需要进行设置 //已经存在连接,则不需要进行设置
if _,rpcInfoOK := cls.mapRpc[nodeInfo.NodeId];rpcInfoOK == true { if _,rpcInfoOK := cls.mapRpc[nodeInfo.NodeId];rpcInfoOK == true {
return return
@@ -226,7 +235,7 @@ func (cls *Cluster) checkDynamicDiscovery(localNodeId int) (bool,bool){
var hasMaster bool //是否配置Master服务 var hasMaster bool //是否配置Master服务
//遍历所有结点 //遍历所有结点
for _,nodeInfo := range cls.discoveryNodeList{ for _,nodeInfo := range cls.masterDiscoveryNodeList{
if nodeInfo.NodeId == localNodeId { if nodeInfo.NodeId == localNodeId {
localMaster = true localMaster = true
} }
@@ -237,8 +246,12 @@ func (cls *Cluster) checkDynamicDiscovery(localNodeId int) (bool,bool){
return localMaster,hasMaster return localMaster,hasMaster
} }
func (cls *Cluster) appendService(serviceName string){ func (cls *Cluster) appendService(serviceName string,bPublicService bool){
cls.localNodeInfo.ServiceList = append(cls.localNodeInfo.ServiceList,serviceName) cls.localNodeInfo.ServiceList = append(cls.localNodeInfo.ServiceList,serviceName)
if bPublicService {
cls.localNodeInfo.PublicServiceList = append(cls.localNodeInfo.PublicServiceList,serviceName)
}
if _,ok:=cls.mapServiceNode[serviceName];ok==false { if _,ok:=cls.mapServiceNode[serviceName];ok==false {
cls.mapServiceNode[serviceName] = map[int]struct{}{} cls.mapServiceNode[serviceName] = map[int]struct{}{}
} }
@@ -246,7 +259,17 @@ func (cls *Cluster) appendService(serviceName string){
} }
func (cls *Cluster) GetDiscoveryNodeList() []NodeInfo{ func (cls *Cluster) GetDiscoveryNodeList() []NodeInfo{
return cls.discoveryNodeList return cls.masterDiscoveryNodeList
}
func (cls *Cluster) GetMasterDiscoveryNodeInfo(nodeId int) *NodeInfo{
for i:=0;i<len(cls.masterDiscoveryNodeList);i++{
if cls.masterDiscoveryNodeList[i].NodeId == nodeId {
return &cls.masterDiscoveryNodeList[i]
}
}
return nil
} }
func (cls *Cluster) SetupServiceDiscovery(localNodeId int,setupServiceFun SetupServiceFun) { func (cls *Cluster) SetupServiceDiscovery(localNodeId int,setupServiceFun SetupServiceFun) {
@@ -265,9 +288,9 @@ func (cls *Cluster) SetupServiceDiscovery(localNodeId int,setupServiceFun SetupS
//2.如果为动态服务发现安装本地发现服务 //2.如果为动态服务发现安装本地发现服务
cls.serviceDiscovery = getDynamicDiscovery() cls.serviceDiscovery = getDynamicDiscovery()
if localMaster == true { if localMaster == true {
cls.appendService(DynamicDiscoveryMasterName) cls.appendService(DynamicDiscoveryMasterName,false)
} }
cls.appendService(DynamicDiscoveryClientName) cls.appendService(DynamicDiscoveryClientName,true)
} }

View File

@@ -17,7 +17,7 @@ const DynamicDiscoveryClientNameRpcMethod = DynamicDiscoveryClientName+".RPC_Sub
type DynamicDiscoveryMaster struct { type DynamicDiscoveryMaster struct {
service.Service service.Service
mapNodeInfo map[int32] *rpc.NodeInfo mapNodeInfo map[int32]struct{}
nodeInfo []*rpc.NodeInfo nodeInfo []*rpc.NodeInfo
} }
@@ -47,11 +47,12 @@ func (ds *DynamicDiscoveryMaster) addNodeInfo(nodeInfo *rpc.NodeInfo){
if ok == true { if ok == true {
return return
} }
ds.mapNodeInfo[nodeInfo.NodeId] = struct{}{}
ds.nodeInfo = append(ds.nodeInfo,nodeInfo) ds.nodeInfo = append(ds.nodeInfo,nodeInfo)
} }
func (ds *DynamicDiscoveryMaster) OnInit() error{ func (ds *DynamicDiscoveryMaster) OnInit() error{
ds.mapNodeInfo = make(map[int32] *rpc.NodeInfo,20) ds.mapNodeInfo = make(map[int32] struct{},20)
ds.RegRpcListener(ds) ds.RegRpcListener(ds)
return nil return nil
@@ -77,11 +78,13 @@ func (ds *DynamicDiscoveryMaster) OnNodeConnected(nodeId int){
var notifyDiscover rpc.SubscribeDiscoverNotify var notifyDiscover rpc.SubscribeDiscoverNotify
notifyDiscover.IsFull = true notifyDiscover.IsFull = true
notifyDiscover.NodeInfo = ds.nodeInfo notifyDiscover.NodeInfo = ds.nodeInfo
notifyDiscover.MasterNodeId = int32(cluster.GetLocalNodeInfo().NodeId)
ds.GoNode(nodeId,DynamicDiscoveryClientNameRpcMethod,&notifyDiscover) ds.GoNode(nodeId,DynamicDiscoveryClientNameRpcMethod,&notifyDiscover)
} }
func (ds *DynamicDiscoveryMaster) OnNodeDisconnect(nodeId int){ func (ds *DynamicDiscoveryMaster) OnNodeDisconnect(nodeId int){
var notifyDiscover rpc.SubscribeDiscoverNotify var notifyDiscover rpc.SubscribeDiscoverNotify
notifyDiscover.MasterNodeId = int32(cluster.GetLocalNodeInfo().NodeId)
notifyDiscover.DelNodeId = int32(nodeId) notifyDiscover.DelNodeId = int32(nodeId)
//删除结点 //删除结点
cluster.DelNode(nodeId,true) cluster.DelNode(nodeId,true)
@@ -89,7 +92,7 @@ func (ds *DynamicDiscoveryMaster) OnNodeDisconnect(nodeId int){
} }
// 收到注册过来的结点 // 收到注册过来的结点
func (ds *DynamicDiscoveryMaster) RPC_RegServiceDiscover(req *rpc.ServiceDiscoverReq, res *rpc.ServiceDiscoverRes) error{ func (ds *DynamicDiscoveryMaster) RPC_RegServiceDiscover(req *rpc.ServiceDiscoverReq, res *rpc.Empty) error{
if req.NodeInfo == nil { if req.NodeInfo == nil {
err := fmt.Errorf("RPC_RegServiceDiscover req is error.") err := fmt.Errorf("RPC_RegServiceDiscover req is error.")
log.Error(err.Error()) log.Error(err.Error())
@@ -99,6 +102,7 @@ func (ds *DynamicDiscoveryMaster) RPC_RegServiceDiscover(req *rpc.ServiceDiscove
//广播给其他所有结点 //广播给其他所有结点
var notifyDiscover rpc.SubscribeDiscoverNotify var notifyDiscover rpc.SubscribeDiscoverNotify
notifyDiscover.MasterNodeId = int32(cluster.GetLocalNodeInfo().NodeId)
notifyDiscover.NodeInfo = append(notifyDiscover.NodeInfo,req.NodeInfo) notifyDiscover.NodeInfo = append(notifyDiscover.NodeInfo,req.NodeInfo)
ds.CastGo(DynamicDiscoveryClientNameRpcMethod,&notifyDiscover) ds.CastGo(DynamicDiscoveryClientNameRpcMethod,&notifyDiscover)
@@ -120,7 +124,6 @@ func (ds *DynamicDiscoveryMaster) RPC_RegServiceDiscover(req *rpc.ServiceDiscove
//加入到本地Cluster模块中将连接该结点 //加入到本地Cluster模块中将连接该结点
//如果本结点不为master结点而且没有可使用的服务不加入 //如果本结点不为master结点而且没有可使用的服务不加入
cluster.serviceDiscoverySetNodeInfo(&nodeInfo) cluster.serviceDiscoverySetNodeInfo(&nodeInfo)
res.NodeInfo = ds.nodeInfo
return nil return nil
} }
@@ -132,8 +135,6 @@ func (dc *DynamicDiscoveryClient) OnInit() error{
func (dc *DynamicDiscoveryClient) OnStart(){ func (dc *DynamicDiscoveryClient) OnStart(){
//2.添加并连接发现主结点 //2.添加并连接发现主结点
localNodeInfo := cluster.GetLocalNodeInfo()
localNodeInfo.PublicServiceList = append(localNodeInfo.PublicServiceList,DynamicDiscoveryClientName)
dc.addDiscoveryMaster() dc.addDiscoveryMaster()
} }
@@ -149,36 +150,76 @@ func (dc *DynamicDiscoveryClient) addDiscoveryMaster(){
} }
//订阅发现的服务通知 //订阅发现的服务通知
func (dc *DynamicDiscoveryClient) RPC_SubServiceDiscover(req *rpc.SubscribeDiscoverNotify) error{ func (dc *DynamicDiscoveryClient) RPC_SubServiceDiscover(req *rpc.SubscribeDiscoverNotify) error {
//如果为完整同步,则找出差异的结点 DiscoveryNodeInfo := cluster.GetMasterDiscoveryNodeInfo(int(req.MasterNodeId))
var willDelNodeId []int mapMasterDiscoveryService := map[string]struct{}{}
if req.IsFull { if DiscoveryNodeInfo != nil {
mapNodeId := make(map[int32]struct{},len(req.NodeInfo)) for i := 0; i < len(DiscoveryNodeInfo.NeighborService); i++ {
for _,nodeInfo:= range req.NodeInfo{ mapMasterDiscoveryService[DiscoveryNodeInfo.NeighborService[i]] = struct{}{}
mapNodeId[nodeInfo.NodeId] = struct{}{} }
}
mapNodeInfo := map[int32]*rpc.NodeInfo{}
//如果Master没有配置发现的服务
if len(mapMasterDiscoveryService) == 0 {
//如果为完整同步,则找出差异的结点
var willDelNodeId []int
if req.IsFull {
mapNodeId := make(map[int32]struct{}, len(req.NodeInfo))
for _, nodeInfo := range req.NodeInfo {
mapNodeId[nodeInfo.NodeId] = struct{}{}
}
cluster.FetchAllNodeId(func(nodeId int) {
if nodeId != dc.localNodeId {
if _, ok := mapNodeId[int32(nodeId)]; ok == false {
willDelNodeId = append(willDelNodeId, nodeId)
}
}
})
} }
cluster.FetchAllNodeId(func(nodeId int){ //忽略本地结点
if nodeId != dc.localNodeId { if req.DelNodeId != int32(dc.localNodeId) && req.DelNodeId > 0 {
if _, ok := mapNodeId[int32(nodeId)]; ok == false { willDelNodeId = append(willDelNodeId, int(req.DelNodeId))
willDelNodeId = append(willDelNodeId, nodeId) }
//删除不必要的结点
for _, nodeId := range willDelNodeId {
dc.funDelService(nodeId, false)
}
}
for _, nodeInfo := range req.NodeInfo {
//不对本地结点或者不存在任何公开服务的结点
if int(nodeInfo.NodeId) == dc.localNodeId {
continue
}
//遍历所有的公开服务,并筛选之
for _, serviceName := range nodeInfo.PublicServiceList {
//只有存在配置时才做筛选
if len(mapMasterDiscoveryService)>0 {
if _, ok := mapMasterDiscoveryService[serviceName]; ok == false {
continue
} }
} }
})
nInfo := mapNodeInfo[nodeInfo.NodeId]
if nInfo == nil {
nInfo = &rpc.NodeInfo{}
nInfo.NodeId = nodeInfo.NodeId
nInfo.NodeName = nodeInfo.NodeName
nInfo.ListenAddr = nodeInfo.ListenAddr
mapNodeInfo[nodeInfo.NodeId] = nInfo
}
nInfo.PublicServiceList = append(nInfo.PublicServiceList, serviceName)
}
} }
//忽略本地结点 //设置新结点
if req.DelNodeId != int32(dc.localNodeId) && req.DelNodeId>0 { for _, nodeInfo := range mapNodeInfo {
willDelNodeId = append(willDelNodeId, int(req.DelNodeId))
}
//删除不必要的结点
for _,nodeId := range willDelNodeId {
dc.funDelService(nodeId,false)
}
//发现新结点
for _, nodeInfo := range req.NodeInfo {
dc.setNodeInfo(nodeInfo) dc.setNodeInfo(nodeInfo)
} }
@@ -186,8 +227,8 @@ func (dc *DynamicDiscoveryClient) RPC_SubServiceDiscover(req *rpc.SubscribeDisco
} }
func (dc *DynamicDiscoveryClient) isDiscoverNode(nodeId int) bool{ func (dc *DynamicDiscoveryClient) isDiscoverNode(nodeId int) bool{
for i:=0;i< len(cluster.discoveryNodeList);i++{ for i:=0;i< len(cluster.masterDiscoveryNodeList);i++{
if cluster.discoveryNodeList[i].NodeId == nodeId { if cluster.masterDiscoveryNodeList[i].NodeId == nodeId {
return true return true
} }
} }
@@ -196,7 +237,8 @@ func (dc *DynamicDiscoveryClient) isDiscoverNode(nodeId int) bool{
} }
func (dc *DynamicDiscoveryClient) OnNodeConnected(nodeId int) { func (dc *DynamicDiscoveryClient) OnNodeConnected(nodeId int) {
if dc.isDiscoverNode(nodeId) == false { nodeInfo := cluster.GetMasterDiscoveryNodeInfo(nodeId)
if nodeInfo == nil {
return return
} }
@@ -205,12 +247,14 @@ func (dc *DynamicDiscoveryClient) OnNodeConnected(nodeId int) {
req.NodeInfo.NodeId = int32(cluster.localNodeInfo.NodeId) req.NodeInfo.NodeId = int32(cluster.localNodeInfo.NodeId)
req.NodeInfo.NodeName = cluster.localNodeInfo.NodeName req.NodeInfo.NodeName = cluster.localNodeInfo.NodeName
req.NodeInfo.ListenAddr = cluster.localNodeInfo.ListenAddr req.NodeInfo.ListenAddr = cluster.localNodeInfo.ListenAddr
req.NodeInfo.PublicServiceList = cluster.localNodeInfo.PublicServiceList //DiscoveryNode配置中没有配置NeighborService则同步当前结点所有服务
if len(nodeInfo.NeighborService)==0{
req.NodeInfo.PublicServiceList = cluster.localNodeInfo.PublicServiceList
}
//如果是连接发现主服成功,则同步服务信息 //向Master服务同步本Node服务信息
err := dc.AsyncCallNode(nodeId, DynamicDiscoveryMasterNameRpcMethod, &req, func(res *rpc.ServiceDiscoverRes, err error) { err := dc.AsyncCallNode(nodeId, DynamicDiscoveryMasterNameRpcMethod, &req, func(res *rpc.Empty, err error) {
if err != nil { if err != nil {
cluster.DelNode(nodeId,true)
log.Error("call %s is fail :%s", DynamicDiscoveryMasterNameRpcMethod, err.Error()) log.Error("call %s is fail :%s", DynamicDiscoveryMasterNameRpcMethod, err.Error())
return return
} }

View File

@@ -11,7 +11,7 @@ import (
var json = jsoniter.ConfigCompatibleWithStandardLibrary var json = jsoniter.ConfigCompatibleWithStandardLibrary
type NodeInfoList struct { type NodeInfoList struct {
DiscoveryNode []NodeInfo //用于服务发现Node MasterDiscoveryNode []NodeInfo //用于服务发现Node
NodeList []NodeInfo NodeList []NodeInfo
} }
@@ -65,7 +65,7 @@ func (cls *Cluster) readServiceConfig(filepath string) (map[string]interface{},
func (cls *Cluster) readLocalClusterConfig(nodeId int) ([]NodeInfo,[]NodeInfo,error) { func (cls *Cluster) readLocalClusterConfig(nodeId int) ([]NodeInfo,[]NodeInfo,error) {
var nodeInfoList []NodeInfo var nodeInfoList []NodeInfo
var discoverNodeList []NodeInfo var masterDiscoverNodeList []NodeInfo
clusterCfgPath :=strings.TrimRight(configDir,"/") +"/cluster" clusterCfgPath :=strings.TrimRight(configDir,"/") +"/cluster"
fileInfoList,err := ioutil.ReadDir(clusterCfgPath) fileInfoList,err := ioutil.ReadDir(clusterCfgPath)
if err != nil { if err != nil {
@@ -80,7 +80,7 @@ func (cls *Cluster) readLocalClusterConfig(nodeId int) ([]NodeInfo,[]NodeInfo,er
if err != nil { if err != nil {
return nil,nil,fmt.Errorf("read file path %s is error:%+v" ,filePath,err) return nil,nil,fmt.Errorf("read file path %s is error:%+v" ,filePath,err)
} }
discoverNodeList = append(discoverNodeList,localNodeInfoList.DiscoveryNode...) masterDiscoverNodeList = append(masterDiscoverNodeList,localNodeInfoList.MasterDiscoveryNode...)
for _,nodeInfo := range localNodeInfoList.NodeList { for _,nodeInfo := range localNodeInfoList.NodeList {
if nodeInfo.NodeId == nodeId || nodeId == 0 { if nodeInfo.NodeId == nodeId || nodeId == 0 {
nodeInfoList = append(nodeInfoList,nodeInfo) nodeInfoList = append(nodeInfoList,nodeInfo)
@@ -105,7 +105,7 @@ func (cls *Cluster) readLocalClusterConfig(nodeId int) ([]NodeInfo,[]NodeInfo,er
} }
return discoverNodeList,nodeInfoList,nil return masterDiscoverNodeList,nodeInfoList,nil
} }
func (cls *Cluster) readLocalService(localNodeId int) error { func (cls *Cluster) readLocalService(localNodeId int) error {
@@ -193,7 +193,7 @@ func (cls *Cluster) InitCfg(localNodeId int) error{
if cls.checkDiscoveryNodeList(discoveryNode) ==false { if cls.checkDiscoveryNodeList(discoveryNode) ==false {
return fmt.Errorf("DiscoveryNode config is error!") return fmt.Errorf("DiscoveryNode config is error!")
} }
cls.discoveryNodeList = discoveryNode cls.masterDiscoveryNodeList = discoveryNode
//读取本地服务配置 //读取本地服务配置
err = cls.readLocalService(localNodeId) err = cls.readLocalService(localNodeId)

View File

@@ -151,9 +151,10 @@ func (m *ServiceDiscoverReq) GetNodeInfo() *NodeInfo {
//Master->Client //Master->Client
type SubscribeDiscoverNotify struct { type SubscribeDiscoverNotify struct {
IsFull bool `protobuf:"varint,1,opt,name=IsFull,proto3" json:"IsFull,omitempty"` MasterNodeId int32 `protobuf:"varint,1,opt,name=MasterNodeId,proto3" json:"MasterNodeId,omitempty"`
DelNodeId int32 `protobuf:"varint,2,opt,name=DelNodeId,proto3" json:"DelNodeId,omitempty"` IsFull bool `protobuf:"varint,2,opt,name=IsFull,proto3" json:"IsFull,omitempty"`
NodeInfo []*NodeInfo `protobuf:"bytes,3,rep,name=nodeInfo,proto3" json:"nodeInfo,omitempty"` DelNodeId int32 `protobuf:"varint,3,opt,name=DelNodeId,proto3" json:"DelNodeId,omitempty"`
NodeInfo []*NodeInfo `protobuf:"bytes,4,rep,name=nodeInfo,proto3" json:"nodeInfo,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@@ -192,6 +193,13 @@ func (m *SubscribeDiscoverNotify) XXX_DiscardUnknown() {
var xxx_messageInfo_SubscribeDiscoverNotify proto.InternalMessageInfo var xxx_messageInfo_SubscribeDiscoverNotify proto.InternalMessageInfo
func (m *SubscribeDiscoverNotify) GetMasterNodeId() int32 {
if m != nil {
return m.MasterNodeId
}
return 0
}
func (m *SubscribeDiscoverNotify) GetIsFull() bool { func (m *SubscribeDiscoverNotify) GetIsFull() bool {
if m != nil { if m != nil {
return m.IsFull return m.IsFull
@@ -214,25 +222,24 @@ func (m *SubscribeDiscoverNotify) GetNodeInfo() []*NodeInfo {
} }
//Master->Client //Master->Client
type ServiceDiscoverRes struct { type Empty struct {
NodeInfo []*NodeInfo `protobuf:"bytes,1,rep,name=nodeInfo,proto3" json:"nodeInfo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *ServiceDiscoverRes) Reset() { *m = ServiceDiscoverRes{} } func (m *Empty) Reset() { *m = Empty{} }
func (m *ServiceDiscoverRes) String() string { return proto.CompactTextString(m) } func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*ServiceDiscoverRes) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*ServiceDiscoverRes) Descriptor() ([]byte, []int) { func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_9bfdd3ec0419520f, []int{3} return fileDescriptor_9bfdd3ec0419520f, []int{3}
} }
func (m *ServiceDiscoverRes) XXX_Unmarshal(b []byte) error { func (m *Empty) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
} }
func (m *ServiceDiscoverRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic { if deterministic {
return xxx_messageInfo_ServiceDiscoverRes.Marshal(b, m, deterministic) return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
} else { } else {
b = b[:cap(b)] b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b) n, err := m.MarshalToSizedBuffer(b)
@@ -242,55 +249,49 @@ func (m *ServiceDiscoverRes) XXX_Marshal(b []byte, deterministic bool) ([]byte,
return b[:n], nil return b[:n], nil
} }
} }
func (m *ServiceDiscoverRes) XXX_Merge(src proto.Message) { func (m *Empty) XXX_Merge(src proto.Message) {
xxx_messageInfo_ServiceDiscoverRes.Merge(m, src) xxx_messageInfo_Empty.Merge(m, src)
} }
func (m *ServiceDiscoverRes) XXX_Size() int { func (m *Empty) XXX_Size() int {
return m.Size() return m.Size()
} }
func (m *ServiceDiscoverRes) XXX_DiscardUnknown() { func (m *Empty) XXX_DiscardUnknown() {
xxx_messageInfo_ServiceDiscoverRes.DiscardUnknown(m) xxx_messageInfo_Empty.DiscardUnknown(m)
} }
var xxx_messageInfo_ServiceDiscoverRes proto.InternalMessageInfo var xxx_messageInfo_Empty proto.InternalMessageInfo
func (m *ServiceDiscoverRes) GetNodeInfo() []*NodeInfo {
if m != nil {
return m.NodeInfo
}
return nil
}
func init() { func init() {
proto.RegisterType((*NodeInfo)(nil), "rpc.NodeInfo") proto.RegisterType((*NodeInfo)(nil), "rpc.NodeInfo")
proto.RegisterType((*ServiceDiscoverReq)(nil), "rpc.ServiceDiscoverReq") proto.RegisterType((*ServiceDiscoverReq)(nil), "rpc.ServiceDiscoverReq")
proto.RegisterType((*SubscribeDiscoverNotify)(nil), "rpc.SubscribeDiscoverNotify") proto.RegisterType((*SubscribeDiscoverNotify)(nil), "rpc.SubscribeDiscoverNotify")
proto.RegisterType((*ServiceDiscoverRes)(nil), "rpc.ServiceDiscoverRes") proto.RegisterType((*Empty)(nil), "rpc.Empty")
} }
func init() { proto.RegisterFile("rpc/dynamicdiscover.proto", fileDescriptor_9bfdd3ec0419520f) } func init() { proto.RegisterFile("rpc/dynamicdiscover.proto", fileDescriptor_9bfdd3ec0419520f) }
var fileDescriptor_9bfdd3ec0419520f = []byte{ var fileDescriptor_9bfdd3ec0419520f = []byte{
// 295 bytes of a gzipped FileDescriptorProto // 305 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xcd, 0x4a, 0xfc, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xd1, 0x4a, 0xc3, 0x30,
0x14, 0xc5, 0xc9, 0xf4, 0xdf, 0xf9, 0xb7, 0x57, 0x5c, 0x18, 0x41, 0xa3, 0x48, 0x29, 0x5d, 0x55, 0x18, 0x85, 0x89, 0x5d, 0xb7, 0xee, 0x57, 0x2f, 0x8c, 0xa0, 0x51, 0xa4, 0x94, 0x5e, 0x55, 0x90,
0x90, 0x0e, 0xe8, 0x03, 0x88, 0x32, 0x08, 0x03, 0x52, 0x86, 0xcc, 0xce, 0x5d, 0x9b, 0x64, 0x20, 0x0e, 0xf4, 0x01, 0x44, 0x99, 0xc2, 0x40, 0xc7, 0xc8, 0xee, 0xbc, 0x6b, 0x93, 0x0c, 0x02, 0x5d,
0xd0, 0x69, 0x6a, 0xfa, 0x01, 0xe3, 0x03, 0xf9, 0x2c, 0x2e, 0x7d, 0x04, 0xe9, 0x93, 0xc8, 0xc4, 0x13, 0xd3, 0x6c, 0xb0, 0x97, 0xf1, 0xd2, 0x67, 0xf1, 0xd2, 0x47, 0x90, 0x3d, 0x89, 0x2c, 0x66,
0x4c, 0xfd, 0x64, 0x76, 0xf9, 0xdd, 0x9b, 0x9c, 0x7b, 0xce, 0x0d, 0x9c, 0xe8, 0x8a, 0x4d, 0xf8, 0x73, 0x43, 0xf0, 0x2e, 0xdf, 0x7f, 0x72, 0xc2, 0x39, 0x7f, 0xe0, 0xcc, 0x68, 0xd6, 0xe3, 0x8b,
0xba, 0xcc, 0x56, 0x92, 0x71, 0x59, 0x33, 0xd5, 0x09, 0x9d, 0x54, 0x5a, 0x35, 0x0a, 0x3b, 0xba, 0xba, 0x98, 0x4a, 0xc6, 0x65, 0xc3, 0xd4, 0x5c, 0x98, 0x5c, 0x1b, 0x65, 0x15, 0x0e, 0x8c, 0x66,
0x62, 0xd1, 0x33, 0x02, 0x2f, 0x55, 0x5c, 0xcc, 0xca, 0xa5, 0xc2, 0x47, 0x30, 0x36, 0x67, 0x4e, 0xe9, 0x3b, 0x82, 0x68, 0xa8, 0xb8, 0x18, 0xd4, 0x13, 0x85, 0x4f, 0xa0, 0xed, 0xce, 0x9c, 0xa0,
0x50, 0x88, 0x62, 0x97, 0x5a, 0xc2, 0xa7, 0x1f, 0x77, 0xd2, 0x6c, 0x25, 0xc8, 0x28, 0x44, 0xb1, 0x04, 0x65, 0x21, 0xf5, 0x84, 0xcf, 0x7f, 0xee, 0x0c, 0x8b, 0xa9, 0x20, 0x7b, 0x09, 0xca, 0xba,
0x4f, 0x07, 0xc6, 0x01, 0xc0, 0xbd, 0xac, 0x1b, 0x51, 0xde, 0x70, 0xae, 0x89, 0x63, 0xba, 0x5f, 0x74, 0xc3, 0x38, 0x06, 0x78, 0x92, 0x8d, 0x15, 0xf5, 0x1d, 0xe7, 0x86, 0x04, 0x4e, 0xdd, 0x9a,
0x2a, 0x98, 0xc0, 0xff, 0xb9, 0x96, 0x5d, 0xd6, 0x08, 0xf2, 0x2f, 0x44, 0xb1, 0x47, 0xb7, 0x88, 0x60, 0x02, 0x9d, 0x91, 0x91, 0xf3, 0xc2, 0x0a, 0xd2, 0x4a, 0x50, 0x16, 0xd1, 0x35, 0xe2, 0x2b,
0x2f, 0xe0, 0x60, 0xde, 0xe6, 0x85, 0x64, 0x0b, 0xa1, 0x3b, 0xc9, 0xc4, 0xe6, 0x11, 0x71, 0x43, 0x38, 0x1a, 0xcd, 0xca, 0x4a, 0xb2, 0xb1, 0x30, 0x73, 0xc9, 0xc4, 0xca, 0x44, 0xc2, 0x24, 0xc8,
0x27, 0xf6, 0xe9, 0xef, 0x46, 0x74, 0x0d, 0xd8, 0xe2, 0xd4, 0xc6, 0xa0, 0xe2, 0x11, 0x9f, 0x83, 0xba, 0xf4, 0xaf, 0x90, 0xde, 0x02, 0xf6, 0xd8, 0xf7, 0x35, 0xa8, 0x78, 0xc5, 0x97, 0x10, 0xd5,
0x57, 0x5a, 0xf7, 0xc6, 0xf3, 0xde, 0xe5, 0x7e, 0xa2, 0x2b, 0x96, 0x6c, 0x23, 0xd1, 0xa1, 0x1d, 0x3e, 0xbd, 0xcb, 0xbc, 0x7f, 0x7d, 0x98, 0x1b, 0xcd, 0xf2, 0x75, 0x25, 0xba, 0x91, 0xd3, 0x37,
0x3d, 0xc1, 0xf1, 0xa2, 0xcd, 0x6b, 0xa6, 0x65, 0x3e, 0x48, 0xa4, 0xaa, 0x91, 0xcb, 0xf5, 0x26, 0x04, 0xa7, 0xe3, 0x59, 0xd9, 0x30, 0x23, 0xcb, 0xcd, 0x1b, 0x43, 0x65, 0xe5, 0x64, 0x81, 0x53,
0xf7, 0xac, 0xbe, 0x6b, 0x8b, 0xc2, 0x68, 0x78, 0xd4, 0x12, 0x3e, 0x03, 0x7f, 0x2a, 0x0a, 0xbb, 0x38, 0x78, 0x2e, 0x1a, 0xbb, 0xe2, 0xad, 0xfa, 0x3b, 0xb3, 0xd5, 0x72, 0x06, 0xcd, 0xe3, 0xac,
0x92, 0x91, 0x59, 0xc9, 0x67, 0xe1, 0xdb, 0x6c, 0x27, 0x74, 0x76, 0xcd, 0xfe, 0xcb, 0x7c, 0xfd, 0xaa, 0xdc, 0x0a, 0x22, 0xea, 0x09, 0x5f, 0x40, 0xb7, 0x2f, 0x2a, 0x6f, 0x0c, 0x9c, 0xf1, 0x77,
0xc3, 0xfc, 0x2e, 0x81, 0xdb, 0xc3, 0x97, 0x3e, 0x40, 0xaf, 0x7d, 0x80, 0xde, 0xfa, 0x00, 0x3d, 0xb0, 0x13, 0xb0, 0x95, 0x04, 0xff, 0x05, 0xec, 0x40, 0xf8, 0x30, 0xd5, 0x76, 0x71, 0x7f, 0xfc,
0xb8, 0xc9, 0x44, 0x57, 0x2c, 0x1f, 0x9b, 0x7f, 0xbc, 0x7a, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x9d, 0xb1, 0x8c, 0xd1, 0xe7, 0x32, 0x46, 0x5f, 0xcb, 0x18, 0xbd, 0x84, 0x79, 0xcf, 0x68, 0x56, 0xb6,
0x3f, 0x5b, 0x31, 0xe4, 0x01, 0x00, 0x00, 0xdd, 0xa7, 0xdd, 0x7c, 0x07, 0x00, 0x00, 0xff, 0xff, 0xa7, 0x79, 0x82, 0x2a, 0xd1, 0x01, 0x00,
0x00,
} }
func (m *NodeInfo) Marshal() (dAtA []byte, err error) { func (m *NodeInfo) Marshal() (dAtA []byte, err error) {
@@ -432,13 +433,13 @@ func (m *SubscribeDiscoverNotify) MarshalToSizedBuffer(dAtA []byte) (int, error)
i = encodeVarintDynamicdiscover(dAtA, i, uint64(size)) i = encodeVarintDynamicdiscover(dAtA, i, uint64(size))
} }
i-- i--
dAtA[i] = 0x1a dAtA[i] = 0x22
} }
} }
if m.DelNodeId != 0 { if m.DelNodeId != 0 {
i = encodeVarintDynamicdiscover(dAtA, i, uint64(m.DelNodeId)) i = encodeVarintDynamicdiscover(dAtA, i, uint64(m.DelNodeId))
i-- i--
dAtA[i] = 0x10 dAtA[i] = 0x18
} }
if m.IsFull { if m.IsFull {
i-- i--
@@ -448,12 +449,17 @@ func (m *SubscribeDiscoverNotify) MarshalToSizedBuffer(dAtA []byte) (int, error)
dAtA[i] = 0 dAtA[i] = 0
} }
i-- i--
dAtA[i] = 0x10
}
if m.MasterNodeId != 0 {
i = encodeVarintDynamicdiscover(dAtA, i, uint64(m.MasterNodeId))
i--
dAtA[i] = 0x8 dAtA[i] = 0x8
} }
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
func (m *ServiceDiscoverRes) Marshal() (dAtA []byte, err error) { func (m *Empty) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size]) n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -463,12 +469,12 @@ func (m *ServiceDiscoverRes) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil return dAtA[:n], nil
} }
func (m *ServiceDiscoverRes) MarshalTo(dAtA []byte) (int, error) { func (m *Empty) MarshalTo(dAtA []byte) (int, error) {
size := m.Size() size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size]) return m.MarshalToSizedBuffer(dAtA[:size])
} }
func (m *ServiceDiscoverRes) MarshalToSizedBuffer(dAtA []byte) (int, error) { func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA) i := len(dAtA)
_ = i _ = i
var l int var l int
@@ -477,20 +483,6 @@ func (m *ServiceDiscoverRes) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized) i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized)
} }
if len(m.NodeInfo) > 0 {
for iNdEx := len(m.NodeInfo) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.NodeInfo[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintDynamicdiscover(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
}
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
@@ -559,6 +551,9 @@ func (m *SubscribeDiscoverNotify) Size() (n int) {
} }
var l int var l int
_ = l _ = l
if m.MasterNodeId != 0 {
n += 1 + sovDynamicdiscover(uint64(m.MasterNodeId))
}
if m.IsFull { if m.IsFull {
n += 2 n += 2
} }
@@ -577,18 +572,12 @@ func (m *SubscribeDiscoverNotify) Size() (n int) {
return n return n
} }
func (m *ServiceDiscoverRes) Size() (n int) { func (m *Empty) Size() (n int) {
if m == nil { if m == nil {
return 0 return 0
} }
var l int var l int
_ = l _ = l
if len(m.NodeInfo) > 0 {
for _, e := range m.NodeInfo {
l = e.Size()
n += 1 + l + sovDynamicdiscover(uint64(l))
}
}
if m.XXX_unrecognized != nil { if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized) n += len(m.XXX_unrecognized)
} }
@@ -910,6 +899,25 @@ func (m *SubscribeDiscoverNotify) Unmarshal(dAtA []byte) error {
} }
switch fieldNum { switch fieldNum {
case 1: case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field MasterNodeId", wireType)
}
m.MasterNodeId = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowDynamicdiscover
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.MasterNodeId |= int32(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType != 0 { if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field IsFull", wireType) return fmt.Errorf("proto: wrong wireType = %d for field IsFull", wireType)
} }
@@ -929,7 +937,7 @@ func (m *SubscribeDiscoverNotify) Unmarshal(dAtA []byte) error {
} }
} }
m.IsFull = bool(v != 0) m.IsFull = bool(v != 0)
case 2: case 3:
if wireType != 0 { if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field DelNodeId", wireType) return fmt.Errorf("proto: wrong wireType = %d for field DelNodeId", wireType)
} }
@@ -948,7 +956,7 @@ func (m *SubscribeDiscoverNotify) Unmarshal(dAtA []byte) error {
break break
} }
} }
case 3: case 4:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field NodeInfo", wireType) return fmt.Errorf("proto: wrong wireType = %d for field NodeInfo", wireType)
} }
@@ -1007,7 +1015,7 @@ func (m *SubscribeDiscoverNotify) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *ServiceDiscoverRes) Unmarshal(dAtA []byte) error { func (m *Empty) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0
for iNdEx < l { for iNdEx < l {
@@ -1030,46 +1038,12 @@ func (m *ServiceDiscoverRes) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3) fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7) wireType := int(wire & 0x7)
if wireType == 4 { if wireType == 4 {
return fmt.Errorf("proto: ServiceDiscoverRes: wiretype end group for non-group") return fmt.Errorf("proto: Empty: wiretype end group for non-group")
} }
if fieldNum <= 0 { if fieldNum <= 0 {
return fmt.Errorf("proto: ServiceDiscoverRes: illegal tag %d (wire type %d)", fieldNum, wire) return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire)
} }
switch fieldNum { switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field NodeInfo", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowDynamicdiscover
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthDynamicdiscover
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthDynamicdiscover
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.NodeInfo = append(m.NodeInfo, &NodeInfo{})
if err := m.NodeInfo[len(m.NodeInfo)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipDynamicdiscover(dAtA[iNdEx:]) skippy, err := skipDynamicdiscover(dAtA[iNdEx:])

View File

@@ -17,13 +17,12 @@ message ServiceDiscoverReq{
//Master->Client //Master->Client
message SubscribeDiscoverNotify{ message SubscribeDiscoverNotify{
bool IsFull = 1; int32 MasterNodeId = 1;
int32 DelNodeId = 2; bool IsFull = 2;
repeated NodeInfo nodeInfo = 3; int32 DelNodeId = 3;
repeated NodeInfo nodeInfo = 4;
} }
//Master->Client //Master->Client
message ServiceDiscoverRes{ message Empty{
repeated NodeInfo nodeInfo = 1;
} }

View File

@@ -112,7 +112,7 @@ func (agent *RpcAgent) Run() {
for { for {
data,err := agent.conn.ReadMsg() data,err := agent.conn.ReadMsg()
if err != nil { if err != nil {
log.Error("read message: %v,remoteAddress:%s", err,agent.conn.RemoteAddr().String()) log.Error("remoteAddress:%s,read message: %v,",agent.conn.RemoteAddr().String(),err)
//will close tcpconn //will close tcpconn
break break
} }