123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- --[[
- 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)
|