mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +08:00
优化origin默认服务发现
This commit is contained in:
@@ -35,9 +35,10 @@ type OriginDiscoveryClient struct {
|
|||||||
funSetNode FunSetNode
|
funSetNode FunSetNode
|
||||||
localNodeId string
|
localNodeId string
|
||||||
|
|
||||||
mapDiscovery map[string]map[string]struct{} //map[masterNodeId]map[nodeId]struct{}
|
mapDiscovery map[string]map[string][]string //map[masterNodeId]map[nodeId]struct{}
|
||||||
mapMasterNetwork map[string]string
|
//mapMasterNetwork map[string]string
|
||||||
bRetire bool
|
bRetire bool
|
||||||
|
isRegisterOk bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var masterService OriginDiscoveryMaster
|
var masterService OriginDiscoveryMaster
|
||||||
@@ -98,6 +99,7 @@ func (ds *OriginDiscoveryMaster) removeNodeInfo(nodeId string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ds.nsTTL.removeNode(nodeId)
|
||||||
delete(ds.mapNodeInfo,nodeId)
|
delete(ds.mapNodeInfo,nodeId)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,12 +189,13 @@ func (ds *OriginDiscoveryMaster) RpcCastGo(serviceMethod string, args interface{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ds *OriginDiscoveryMaster) RPC_Ping(req *rpc.Ping, res *rpc.Pong) error {
|
func (ds *OriginDiscoveryMaster) RPC_Ping(req *rpc.Ping, res *rpc.Pong) error {
|
||||||
|
log.Debug("ping",log.String("nodeId",req.NodeId))
|
||||||
if ds.isRegNode(req.NodeId) == false{
|
if ds.isRegNode(req.NodeId) == false{
|
||||||
res.Ok = false
|
res.Ok = false
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
//return nil
|
||||||
res.Ok = true
|
res.Ok = true
|
||||||
ds.nsTTL.addAndRefreshNode(req.NodeId)
|
ds.nsTTL.addAndRefreshNode(req.NodeId)
|
||||||
return nil
|
return nil
|
||||||
@@ -256,22 +259,38 @@ func (ds *OriginDiscoveryMaster) RPC_RegServiceDiscover(req *rpc.RegServiceDisco
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ds *OriginDiscoveryMaster) RPC_UnRegServiceDiscover(req *rpc.UnRegServiceDiscoverReq, res *rpc.Empty) error {
|
||||||
|
log.Debug("RPC_UnRegServiceDiscover",log.String("nodeId",req.NodeId))
|
||||||
|
ds.OnNodeDisconnect(req.NodeId)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (dc *OriginDiscoveryClient) OnInit() error {
|
func (dc *OriginDiscoveryClient) OnInit() error {
|
||||||
dc.RegNodeConnListener(dc)
|
dc.RegNodeConnListener(dc)
|
||||||
dc.RegNatsConnListener(dc)
|
dc.RegNatsConnListener(dc)
|
||||||
|
|
||||||
dc.mapDiscovery = map[string]map[string]struct{}{}
|
dc.mapDiscovery = map[string]map[string][]string{}
|
||||||
dc.mapMasterNetwork = map[string]string{}
|
//dc.mapMasterNetwork = map[string]string{}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dc *OriginDiscoveryClient) addMasterNode(masterNodeId string, nodeId string) {
|
func (dc *OriginDiscoveryClient) addMasterNode(masterNodeId string, nodeId string,serviceList []string) {
|
||||||
_, ok := dc.mapDiscovery[masterNodeId]
|
_, ok := dc.mapDiscovery[masterNodeId]
|
||||||
if ok == false {
|
if ok == false {
|
||||||
dc.mapDiscovery[masterNodeId] = map[string]struct{}{}
|
dc.mapDiscovery[masterNodeId] = map[string][]string{}
|
||||||
}
|
}
|
||||||
dc.mapDiscovery[masterNodeId][nodeId] = struct{}{}
|
dc.mapDiscovery[masterNodeId][nodeId] = serviceList
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *OriginDiscoveryClient) getNodePublicService(masterNodeId string,nodeId string) []string{
|
||||||
|
mapNodeId, ok := dc.mapDiscovery[masterNodeId]
|
||||||
|
if ok == false {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
publicService := mapNodeId[nodeId]
|
||||||
|
return publicService
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dc *OriginDiscoveryClient) removeMasterNode(masterNodeId string, nodeId string) {
|
func (dc *OriginDiscoveryClient) removeMasterNode(masterNodeId string, nodeId string) {
|
||||||
@@ -295,10 +314,6 @@ func (dc *OriginDiscoveryClient) findNodeId(nodeId string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (dc *OriginDiscoveryClient) ping(){
|
func (dc *OriginDiscoveryClient) ping(){
|
||||||
if cluster.IsNatsMode() == false {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
interval := time.Duration(cluster.GetOriginDiscovery().TTLSecond)*time.Second
|
interval := time.Duration(cluster.GetOriginDiscovery().TTLSecond)*time.Second
|
||||||
interval = interval /3
|
interval = interval /3
|
||||||
if interval < time.Second {
|
if interval < time.Second {
|
||||||
@@ -306,6 +321,9 @@ func (dc *OriginDiscoveryClient) ping(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
dc.NewTicker(interval,func(t *timer.Ticker){
|
dc.NewTicker(interval,func(t *timer.Ticker){
|
||||||
|
if cluster.IsNatsMode() == false || dc.isRegisterOk == false{
|
||||||
|
return
|
||||||
|
}
|
||||||
var ping rpc.Ping
|
var ping rpc.Ping
|
||||||
ping.NodeId = cluster.GetLocalNodeInfo().NodeId
|
ping.NodeId = cluster.GetLocalNodeInfo().NodeId
|
||||||
masterNodes := GetCluster().GetOriginDiscovery().MasterNodeList
|
masterNodes := GetCluster().GetOriginDiscovery().MasterNodeList
|
||||||
@@ -315,7 +333,7 @@ func (dc *OriginDiscoveryClient) ping(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
masterNodeId := masterNodes[i].NodeId
|
masterNodeId := masterNodes[i].NodeId
|
||||||
dc.AsyncCallNode(masterNodeId,RpcPingMethod,&ping, func(empty *rpc.Pong,err error) {
|
dc.AsyncCallNodeWithTimeout(3*time.Second,masterNodeId,RpcPingMethod,&ping, func(empty *rpc.Pong,err error) {
|
||||||
if err == nil && empty.Ok == false{
|
if err == nil && empty.Ok == false{
|
||||||
//断开master重
|
//断开master重
|
||||||
dc.regServiceDiscover(masterNodeId)
|
dc.regServiceDiscover(masterNodeId)
|
||||||
@@ -349,7 +367,7 @@ func (dc *OriginDiscoveryClient) fullCompareDiffNode(masterNodeId string, mapNod
|
|||||||
}
|
}
|
||||||
|
|
||||||
diffNodeIdSlice := make([]string, 0, len(mapNodeInfo))
|
diffNodeIdSlice := make([]string, 0, len(mapNodeInfo))
|
||||||
mapNodeId := map[string]struct{}{}
|
mapNodeId := map[string][]string{}
|
||||||
mapNodeId, ok := dc.mapDiscovery[masterNodeId]
|
mapNodeId, ok := dc.mapDiscovery[masterNodeId]
|
||||||
if ok == false {
|
if ok == false {
|
||||||
return nil
|
return nil
|
||||||
@@ -368,6 +386,7 @@ func (dc *OriginDiscoveryClient) fullCompareDiffNode(masterNodeId string, mapNod
|
|||||||
|
|
||||||
//订阅发现的服务通知
|
//订阅发现的服务通知
|
||||||
func (dc *OriginDiscoveryClient) RPC_SubServiceDiscover(req *rpc.SubscribeDiscoverNotify) error {
|
func (dc *OriginDiscoveryClient) RPC_SubServiceDiscover(req *rpc.SubscribeDiscoverNotify) error {
|
||||||
|
log.Debug("RPC_SubServiceDiscover",log.String("masterNodeId",req.MasterNodeId),log.String("delNodeId",req.GetDelNodeId()))
|
||||||
mapNodeInfo := map[string]*rpc.NodeInfo{}
|
mapNodeInfo := map[string]*rpc.NodeInfo{}
|
||||||
for _, nodeInfo := range req.NodeInfo {
|
for _, nodeInfo := range req.NodeInfo {
|
||||||
//不对本地结点或者不存在任何公开服务的结点
|
//不对本地结点或者不存在任何公开服务的结点
|
||||||
@@ -414,15 +433,14 @@ func (dc *OriginDiscoveryClient) RPC_SubServiceDiscover(req *rpc.SubscribeDiscov
|
|||||||
|
|
||||||
//删除不必要的结点
|
//删除不必要的结点
|
||||||
for _, nodeId := range willDelNodeId {
|
for _, nodeId := range willDelNodeId {
|
||||||
cluster.TriggerDiscoveryEvent(false,nodeId,nil)
|
cluster.TriggerDiscoveryEvent(false,nodeId,dc.getNodePublicService(req.MasterNodeId, nodeId))
|
||||||
|
dc.funDelNode(nodeId, true)
|
||||||
dc.removeMasterNode(req.MasterNodeId, nodeId)
|
dc.removeMasterNode(req.MasterNodeId, nodeId)
|
||||||
if dc.findNodeId(nodeId) == false {
|
|
||||||
dc.funDelNode(nodeId, false)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//设置新结点
|
//设置新结点
|
||||||
for _, nodeInfo := range mapNodeInfo {
|
for _, nodeInfo := range mapNodeInfo {
|
||||||
|
dc.addMasterNode(req.MasterNodeId, nodeInfo.NodeId,nodeInfo.PublicServiceList)
|
||||||
bSet := dc.setNodeInfo(req.MasterNodeId,nodeInfo)
|
bSet := dc.setNodeInfo(req.MasterNodeId,nodeInfo)
|
||||||
if bSet == false {
|
if bSet == false {
|
||||||
continue
|
continue
|
||||||
@@ -439,6 +457,8 @@ func (dc *OriginDiscoveryClient) OnNodeConnected(nodeId string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (dc *OriginDiscoveryClient) OnRelease(){
|
func (dc *OriginDiscoveryClient) OnRelease(){
|
||||||
|
log.Debug("OriginDiscoveryClient")
|
||||||
|
|
||||||
//取消注册
|
//取消注册
|
||||||
var nodeRetireReq rpc.UnRegServiceDiscoverReq
|
var nodeRetireReq rpc.UnRegServiceDiscoverReq
|
||||||
nodeRetireReq.NodeId = cluster.GetLocalNodeInfo().NodeId
|
nodeRetireReq.NodeId = cluster.GetLocalNodeInfo().NodeId
|
||||||
@@ -510,6 +530,7 @@ func (dc *OriginDiscoveryClient) regServiceDiscover(nodeId string){
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dc.isRegisterOk = true
|
||||||
dc.RPC_SubServiceDiscover(res)
|
dc.RPC_SubServiceDiscover(res)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user