nodeUtil.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. local skynet = require "skynet"
  2. local cluster = require "skynet.cluster"
  3. local clusterName = skynet.getenv("clusterName")
  4. local nodeName = skynet.getenv("nodeName")
  5. local root = {}
  6. function root:send_to_node(node, service, cmd, ...)
  7. if service == nil or cmd == nil then
  8. log.error("node[%s] service[%s] cmd[%s]", node, service, cmd)
  9. return
  10. end
  11. if is_empty(node) or nodeName == node then
  12. -- 本地服务
  13. skynet.send(service, "lua", cmd, ...)
  14. else
  15. -- 集群服务
  16. cluster.send(node, service, cmd, ...)
  17. end
  18. end
  19. function root:call_to_node(node, service, cmd, ...)
  20. if service == nil or cmd == nil then
  21. log.error("call node[%s] service[%s] cmd[%s] is nil", tostring(node), tostring(service), tostring(cmd))
  22. return
  23. end
  24. if is_empty(node) or nodeName == node then
  25. -- 本地服务
  26. local args = {...}
  27. local ret1, ret2, ret3, ret4
  28. local ok, msg =
  29. xpcall(
  30. function()
  31. ret1, ret2, ret3, ret4 = skynet.call(service, "lua", cmd, table.unpack(args))
  32. end,
  33. debug.traceback
  34. )
  35. if not ok then
  36. log.error("call failed msg:%s service:%s cmd:%s", msg, tostring(service), cmd)
  37. return
  38. end
  39. return ret1, ret2, ret3, ret4
  40. else
  41. -- 集群服务
  42. local args = {...}
  43. local ret1, ret2, ret3, ret4
  44. local ok, msg =
  45. xpcall(
  46. function()
  47. ret1, ret2, ret3, ret4 = cluster.call(node, service, cmd, table.unpack(args))
  48. end,
  49. debug.traceback
  50. )
  51. if not ok then
  52. log.error("call failed node:%s service:%s cmd:%s", node, tostring(service), cmd)
  53. return
  54. end
  55. return ret1, ret2, ret3, ret4
  56. end
  57. end
  58. -- 查询集群节点下服务地址
  59. function root:get_node_service_addr(node, name)
  60. local ok, addr = pcall(cluster.query, node, name)
  61. if not ok then
  62. log.error("Node:%s or srv_name:%s donot exist!!!", node, name)
  63. return
  64. end
  65. return addr
  66. end
  67. ----------------------------------------
  68. -- 节点分配
  69. ----------------------------------------
  70. -- 分配游戏服节点/agent
  71. function root:user_dispatch_game_node_and_agent(uid)
  72. local nodeInfo = self:call_to_node("master", ".srvNodeMgr", "user_dispatch_cluster_node", uid, "game")
  73. if nodeInfo == nil or is_empty(nodeInfo.nodeName) then
  74. return
  75. end
  76. local gameNode = nodeInfo.nodeName
  77. local srvAgentMgr = self:get_node_service_addr(gameNode, ".srvAgentMgr")
  78. if srvAgentMgr == nil then
  79. return
  80. end
  81. local agent = self:call_to_node(gameNode, srvAgentMgr, "user_get_game_agent")
  82. if agent == nil then
  83. return
  84. end
  85. return gameNode, agent
  86. end
  87. -- 分配网关节点/agent
  88. function root:user_dispatch_gate_node_and_agent(uid)
  89. local nodeInfo = self:call_to_node("master", ".srvNodeMgr", "user_dispatch_cluster_node", uid, "gate")
  90. if nodeInfo == nil or is_empty(nodeInfo.nodeName) then
  91. return
  92. end
  93. local gameNode = nodeInfo.nodeName
  94. local srvAgentMgr = self:get_node_service_addr(gameNode, ".srvAgentMgr")
  95. if srvAgentMgr == nil then
  96. return
  97. end
  98. local agent = self:call_to_node(gameNode, srvAgentMgr, "user_get_game_agent")
  99. if agent == nil then
  100. return
  101. end
  102. return gameNode, agent
  103. end
  104. -- 玩家登陆服务器
  105. function root:user_master_band_node(uid, ...)
  106. return self:call_to_node("master", ".srvNodeMgr", "user_band_node", clusterName, nodeName, uid, ...)
  107. end
  108. -- 玩家登出服务器
  109. function root:user_master_unband_node(uid, ...)
  110. return self:call_to_node("master", ".srvNodeMgr", "user_unband_node", clusterName, nodeName, uid, ...)
  111. end
  112. ----------------------------------------
  113. -- 节点调用 - 游戏服
  114. ----------------------------------------
  115. -- agent
  116. function root:call_to_game_agent(gameNode, gameAgent, ...)
  117. return self:call_to_node(gameNode, gameAgent, ...)
  118. end
  119. -- send 游戏agent接口处理
  120. function root.sendGameAgentInterface(gameNode, gameAgent, uid, interface, ...)
  121. root.send(gameNode, gameAgent, "doCmd", uid, interface, ...)
  122. end
  123. -- call 游戏agent接口处理
  124. function root.callGameAgentInterface(gameNode, agentAddr, uid, interface, ...)
  125. return root.call(gameNode, agentAddr, "doCmd", uid, interface, ...)
  126. end
  127. -- 获取某种类型的所有节点
  128. function root.get_cluster_node_info_list(nodeType)
  129. local ok, nodes = root.call("master", ".srvNodeMgr", "get_cluster_node_info_list", tostring(nodeType))
  130. if not ok or not nodes then
  131. return
  132. end
  133. return nodes
  134. end
  135. -- 通知业务节点分配服更换节点信息
  136. function root.notifyServerChange(nodeType, nodeList)
  137. root.send("ux3_master", ".ux3_server_mgr", "changeServer", nodeType, nodeList)
  138. end
  139. -- 分配Logic节点
  140. function root.dispatchBattleServer()
  141. local ok, server = root.call("ux3_master", ".ux3_server_mgr", "dispatchBattleServer")
  142. if not ok then
  143. return
  144. end
  145. return server
  146. end
  147. -- 通知业务节点分配服进入Battle节点信息
  148. function root.notifyBattleEnter(nodeName)
  149. root.send("ux3_master", ".ux3_server_mgr", "battleEnter", nodeName)
  150. end
  151. -- 通知业务节点分配服离开Battle节点信息
  152. function root.notifyBattleLeave(nodeName)
  153. root.send("ux3_master", ".ux3_server_mgr", "battleLeave", nodeName)
  154. end
  155. return root