From d9a7ef851f45154187c6da81b6564053b8bd92c5 Mon Sep 17 00:00:00 2001 From: lifeiyi <736926938@qq.com> Date: Mon, 19 Aug 2019 16:46:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9A=8F=E6=9C=BA=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cluster/cluster.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/cluster/cluster.go b/cluster/cluster.go index f987a2a..492be9a 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -2,6 +2,7 @@ package cluster import ( "fmt" + "math/rand" "net" "os" "strconv" @@ -446,6 +447,50 @@ func (ws *CCluster) OnFetchService(iservice service.IService) error { return nil } +func (slf *CCluster) CallRandomService(NodeServiceMethod string, args interface{}, reply interface{}) error { + var servicename string + parts := strings.Split(NodeServiceMethod, ".") + if len(parts) == 2 { + servicename = parts[0] + } else { + service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.CallRandomService(%s) method err", NodeServiceMethod) + return fmt.Errorf("CCluster.GoNode(%s) NodeId method err", NodeServiceMethod) + } + + nodeList := slf.GetNodeIdByServiceName(servicename, true) + if len(nodeList) < 1 { + service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.CallRandomService(%s) no node is online", NodeServiceMethod) + return fmt.Errorf("CCluster.GoNode(%s) no node is online", NodeServiceMethod) + } + + nodeIndex := rand.Intn(len(nodeList)) + nodeID := nodeList[nodeIndex] + + return slf.CallNode(nodeID, NodeServiceMethod, args, reply) +} + +func (slf *CCluster) GoRandomService(NodeServiceMethod string, args interface{}, queueModle bool) error { + var servicename string + parts := strings.Split(NodeServiceMethod, ".") + if len(parts) == 2 { + servicename = parts[0] + } else { + service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.CallRandomService(%s) method err", NodeServiceMethod) + return fmt.Errorf("CCluster.GoNode(%s) NodeId method err", NodeServiceMethod) + } + + nodeList := slf.GetNodeIdByServiceName(servicename, true) + if len(nodeList) < 1 { + service.GetLogger().Printf(sysmodule.LEVER_ERROR, "CCluster.CallRandomService(%s) no node is online", NodeServiceMethod) + return fmt.Errorf("CCluster.GoNode(%s) no node is online", NodeServiceMethod) + } + + nodeIndex := rand.Intn(len(nodeList)) + nodeID := nodeList[nodeIndex] + + return slf.GoNode(nodeID, args, NodeServiceMethod, queueModle) +} + //向远程服务器调用 //Node.servicename.methodname //servicename.methodname @@ -491,6 +536,17 @@ func GetNodeIdByServiceName(serviceName string, bOnline bool) []int { return InstanceClusterMgr().GetNodeIdByServiceName(serviceName, bOnline) } +//随机选择在线的node发送 +func CallRandomService(NodeServiceMethod string, args interface{}, reply interface{}) error { + return InstanceClusterMgr().CallRandomService(NodeServiceMethod, args, reply) +} +func GoRandomService(NodeServiceMethod string, args interface{}) error { + return InstanceClusterMgr().GoRandomService(NodeServiceMethod, args, false) +} +func GoRandomServiceQueue(NodeServiceMethod string, args interface{}) error { + return InstanceClusterMgr().GoRandomService(NodeServiceMethod, args, true) +} + var _self *CCluster func InstanceClusterMgr() *CCluster {