--[[ Descripttion:节点管理 version: Author: Neo,Huang Date: 2022-07-05 20:33:57 LastEditors: Neo,Huang LastEditTime: 2022-07-05 20:35:03 --]] local baseService = require("baseService") local nodeUtil = require("utils.nodeUtil") local root = {} -- 服务器心跳 function root.node_heart_beat(nodeInfo) if is_empty(nodeInfo) or is_empty(nodeInfo.clusterName) or is_empty(nodeInfo.nodeName) then return false end if root.mapCluster == nil then root.mapCluster = {} end if root.mapCluster[nodeInfo.clusterName] == nil then root.mapCluster[nodeInfo.clusterName] = {} end nodeInfo.updateTime = skynet_time() root.mapCluster[nodeInfo.clusterName][nodeInfo.nodeName] = nodeInfo -- 更新权重 if root.mapClusterWeight == nil then root.mapClusterWeight = {} end local weightInfo = {} weightInfo.total = 0 weightInfo.list = {} for k, v in pairs(root.mapCluster[nodeInfo.clusterName]) do local info = {} info.nodeName = v.nodeName info.min = weightInfo.total + 1 weightInfo.total = weightInfo.total + (v.weight or 0) info.max = weightInfo.total if info.max > info.min then table.insert(weightInfo.list, info) end end root.mapClusterWeight[nodeInfo.clusterName] = weightInfo return true end -- 获取所有服务器节点 function root.get_node_info_list() if root.mapCluster == nil then return end local nodeInfoList = nil for k, v in pairs(root.mapCluster) do for _k, _v in pairs(v) do if nodeInfoList == nil then nodeInfoList = {} end table.insert(nodeInfoList, _v) end end return nodeInfoList end -- 根据集群类型获取节点 function root.user_dispatch_cluster_node(uid, clusterName) if is_empty(clusterName) then return end if root.mapCluster == nil or root.mapCluster[clusterName] == nil then return end -- 已分配 if root.mapUid2NodeInfo and root.mapUid2NodeInfo[uid] and root.mapUid2NodeInfo[uid][clusterName] then local nodeName = root.mapUid2NodeInfo[uid][clusterName] if root.mapCluster[clusterName] and root.mapCluster[clusterName][nodeName] then return root.mapCluster[clusterName][nodeName] end end local rand = math.random(root.mapClusterWeight[clusterName].total) for k, v in ipairs(root.mapClusterWeight[clusterName].list) do if v.min < rand and rand <= v.max then if root.mapCluster[clusterName] and root.mapCluster[clusterName][v.nodeName] then return root.mapCluster[clusterName][v.nodeName] end break end end end -- 获取集群节点列表 function root.get_type_node_list(clusterName) return root.mapCluster[clusterName] end -- 热更新 - 配置 function root.update_node_config() for k, v in pairs(root.mapCluster) do for _k, _v in pairs(v) do nodeUtil:send_to_node(_v.nodeName, ".steward", "update_config") end end return true end -- 热更新 - 逻辑 function root.update_node_logic() for k, v in pairs(root.mapCluster) do for _k, _v in pairs(v) do nodeUtil:send_to_node(_v.nodeName, ".steward", "update_logic") end end return true end -- 热更新 - 协议 function root.update_node_proto() for k, v in pairs(root.mapCluster) do for _k, _v in pairs(v) do nodeUtil:send_to_node(_v.nodeName, ".steward", "update_proto") end end return true end -- 热更新 - 节点 function root.update_node() for k, v in pairs(root.mapCluster) do for _k, _v in pairs(v) do nodeUtil:send_to_node(_v.nodeName, ".steward", "update_config") nodeUtil:send_to_node(_v.nodeName, ".steward", "update_logic") nodeUtil:send_to_node(_v.nodeName, ".steward", "update_proto") end end return true end -- 玩家绑定节点 function root.user_band_node(uid, clusterName, nodeName) if root.mapUid2NodeInfo == nil then root.mapUid2NodeInfo = {} end root.mapUid2NodeInfo[uid] = {} root.mapUid2NodeInfo[uid][clusterName] = nodeName -- 在线人数 if root.totalPlayers == nil then root.totalPlayers = 0 end root.totalPlayers = root.totalPlayers + 1 end -- 玩家解绑节点 function root.user_unband_node(uid, clusterName) if root.mapUid2NodeInfo == nil then root.mapUid2NodeInfo = {} end root.mapUid2NodeInfo[uid][clusterName] = nil -- 在线人数 if root.totalPlayers == nil then root.totalPlayers = 0 end root.totalPlayers = math.max(0, root.totalPlayers - 1) end function root.onStart() -- 初始化随机种子 math.randomseed(tostring(skynet_time()):reverse():sub(1, 6)) end baseService.start(root, ".srvNodeMgr", true)