原始笔记:
关闭服务器
后台接连间隔时间发送两个指令,先stopAllGame, 后stopWorld
'执行 stopGame 世界服地址信息:http://127.0.0.1:10000/stopAllGame'
'执行 stopWorld 世界服地址信息:http://127.0.0.1:10000/stopWorld'
stopAllGame:
(world/server/server_mgr.lua ServerMgr:stopAllServer()) 全部登陆服禁止登陆, 全部wgame禁止重连, 修改在线人数为0, 会通知所有wcenterd服务"server.stopAllCenter", 再清掉world里面serverObj数据。
(wcenter/gate/server_mgr.lua) 接收到停服指令stopAllCenter,先清除记录的centerd服务id, 再会通知相应centerd服务"server.stopServer", 然后再通知关闭服务"server.exit"。
(wcenter/center/server/server.lua) centerd服务收到"server.stopServer",会通知所有wgamed服务"stopServer", 然后再执行centerd内其他功能模块stop逻辑。
(server/wgame/gate/gate_cmd.lua) wgamed服务收到"stopServer",关掉入口, 踢下线相应节点内对应的服务器玩家, 然后再执行centerd内其他功能模块stop逻辑。
(wcenter/center/server/server.lua) centerd服务收到"server.exit",停止掉mongod, mysqld链接。再skynet.kill()终止服务。
stopWorld:
(world/server/server_mgr.lua ServerMgr:stopWorld()) 更新etcd的"worldd"内容。 更新world的common表的serverStopDt。 再执行一遍stopAllServer(),是为了保险起见,所以前面多了一步stopAllGame。
再stopAllNode(),是关闭所有节点服务,通知登录服stop,游戏服stop,通知center的stop, 通知nonamed的exit 和 wnoamed的stop
启动服务器
国内海外:
(server/world/server/server_mgr.lua ServerMgr:nodeStart())
a. 各个节点起来之后,调用world的nodeStart
b. 检查节点是否符合etcd配置的,有变动则更新相关联节点信息
c. ServerMgr:startedAllNode() 执行world里面各模块的load方法进行初始化
d. ServerMgr:startAllServers() 主要执行 assignServer(), 为游戏服分配一个center进程。center节点服务器的初始化主要就是在这里,也最容易因为玩家数据过多,初始化时候就报错。
世界服通知wcenterd执行"server.startNewCenter"注册centerd服务。
注册新相应serverId的centerd服务, 执行"server.start", 也是就server的load。
(wcenter/center/server/server.lua) Server.load完之后,Server:onSync()执行通知世界服OnEndSync。
然后世界服通知到登录服和游戏服修改服务器开服状态,以及游戏服允许重连。
e. ServerMgr:makeWgameGroup() 执行world里面各模块的load方法进行初始化
关闭服务器流程
执行顺序
- 先发送指令:
stopAllGame
- 间隔时间后发送指令:
stopWorld
指令说明
POST http://127.0.0.1:10000/stopAllGame
POST http://127.0.0.1:10000/stopWorld
1. stopAllGame 执行流程
-- world/server/server_mgr.lua
ServerMgr:stopAllServer()
功能说明:
- 禁止所有登录服的新登陆
- 禁止所有 wgame 服的重连
- 重置在线人数为 0
- 通知所有 wcenterd 服务
server.stopAllCenter
- 清除 world 中的 serverObj 数据
执行链:
-
wcenterd 收到
server.stopAllCenter
-- wcenter/gate/server_mgr.lua a. 清除记录的centerd服务ID b. 通知centerd服务执行: - "server.stopServer" → 停止服务 - "server.exit" → 终止服务
-
centerd 处理流程
-- wcenter/center/server/server.lua -- 收到"server.stopServer"时: a. 通知所有wgamed服务执行`stopServer` b. 执行其他模块的stop逻辑 -- 收到"server.exit"时: a. 断开数据库连接(mongod/mysqld) b. 调用skynet.kill()终止服务
-
wgamed 处理流程
-- server/wgame/gate/gate_cmd.lua -- 收到"stopServer"时: a. 关闭入口 b. 踢下线对应节点玩家 c. 执行其他模块stop逻辑
2. stopWorld 执行流程
-- world/server/server_mgr.lua
ServerMgr:stopWorld()
功能说明:
- 更新配置:
- 更新 etcd 的
worldd
配置 - 更新 common 表的
serverStopDt
- 更新 etcd 的
- 冗余保护:
- 二次执行
stopAllServer()
(确保服务终止)
- 二次执行
- 节点关闭:
- 执行
stopAllNode()
:- 关闭所有节点服务
- 通知登录服 stop
- 通知游戏服 stop
- 通知 centerd 的 stop
- 执行 nonamed 的 exit
- 执行 wnoamed 的 stop
- 执行
启动服务器流程
核心入口
-- server/world/server/server_mgr.lua
ServerMgr:nodeStart()
启动流程
-
节点启动阶段
a. 各节点启动后调用world的nodeStart b. 校验节点配置与etcd的一致性,更新差异配置
-
节点初始化
ServerMgr:startedAllNode() a. 执行各模块的load方法进行初始化
-
服务启动核心
ServerMgr:startAllServers() a. 执行assignServer() → 为游戏服分配centerd进程 b. 世界服通知wcenterd执行: - "server.startNewCenter" → 注册centerd服务 - "server.start" → 执行server.load初始化
-
服务同步阶段
-- wcenter/center/server/server.lua -- Server.load完成后: a. 通过Server:onSync()通知世界服OnEndSync b. 世界服通知登录服和游戏服: - 更新服务器状态 - 允许游戏服重连
-
组初始化
ServerMgr:makeWgameGroup() a. 执行各模块的load方法二次初始化
关键注意点
- centerd 初始化
- 在
startAllServers()
阶段最易因玩家数据量过大导致初始化失败
- 在
- 冗余保护
stopWorld
中二次执行stopAllServer
保证服务终止可靠性
- 节点管理
- 通过 etcd 配置校验保证节点配置一致性
国内/海外特殊处理
- 启动流程差异:
- 国内/海外节点需分别加载区域配置文件(如 IP 白名单、合规策略)
- 通过
etcd
的region
字段区分服务分组
- 数据库隔离:
- 国内/海外使用独立数据库实例,需在
Server.load
阶段动态切换连接配置
- 国内/海外使用独立数据库实例,需在
附录
常见问题
stopAllGame
后仍有玩家在线- 检查 wgamed 是否未正确执行
stopServer
- 检查 wgamed 是否未正确执行
- centerd 启动失败
- 确认数据库连接池大小
- etcd 配置未同步
- 执行强制同步:
curl -X POST http://127.0.0.1:10000/syncEtcd
- 执行强制同步:
更新说明:
- 补充国内/海外特殊处理章节
- 增加附录-常见问题
- 优化文档层级结构,修复格式中断问题
服务器启动流程图
服务器关闭流程图
流程图使用说明
-
颜色标注:
- 红色框(
critical
):标识高风险操作(如centerd初始化
) - 绿色框(
redundant
):标识冗余保护操作(如二次执行stopAllServer
) - 黄色备注框(
noteclass
):补充关键说明
- 红色框(
-
参数调整:
- 等待间隔时间(
等待N秒
)需根据实际业务设置(建议 10-30 秒) - 节点关闭顺序(
终止nonamed/wnoamed进程
)需与服务器架构严格匹配
- 等待间隔时间(