服务器开启和关闭流程

原始笔记:


关闭服务器
    后台接连间隔时间发送两个指令,先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方法进行初始化




关闭服务器流程

执行顺序

  1. 先发送指令stopAllGame
  2. 间隔时间后发送指令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 数据

执行链

  1. wcenterd 收到server.stopAllCenter

    -- wcenter/gate/server_mgr.lua
    a. 清除记录的centerd服务ID
    b. 通知centerd服务执行:
       - "server.stopServer" → 停止服务
       - "server.exit" → 终止服务
    
  2. centerd 处理流程

    -- wcenter/center/server/server.lua
    -- 收到"server.stopServer"时:
    a. 通知所有wgamed服务执行`stopServer`
    b. 执行其他模块的stop逻辑
    
    -- 收到"server.exit"时:
    a. 断开数据库连接(mongod/mysqld)
    b. 调用skynet.kill()终止服务
    
  3. wgamed 处理流程

    -- server/wgame/gate/gate_cmd.lua
    -- 收到"stopServer"时:
    a. 关闭入口
    b. 踢下线对应节点玩家
    c. 执行其他模块stop逻辑
    

2. stopWorld 执行流程

-- world/server/server_mgr.lua
ServerMgr:stopWorld()

功能说明

  1. 更新配置
    • 更新 etcd 的worldd配置
    • 更新 common 表的serverStopDt
  2. 冗余保护
    • 二次执行stopAllServer()(确保服务终止)
  3. 节点关闭
    • 执行stopAllNode()
      • 关闭所有节点服务
      • 通知登录服 stop
      • 通知游戏服 stop
      • 通知 centerd 的 stop
      • 执行 nonamed 的 exit
      • 执行 wnoamed 的 stop






启动服务器流程

核心入口

-- server/world/server/server_mgr.lua
ServerMgr:nodeStart()

启动流程

  1. 节点启动阶段

    a. 各节点启动后调用world的nodeStart
    b. 校验节点配置与etcd的一致性,更新差异配置
    
  2. 节点初始化

    ServerMgr:startedAllNode()
    a. 执行各模块的load方法进行初始化
    
  3. 服务启动核心

    ServerMgr:startAllServers()
    a. 执行assignServer() → 为游戏服分配centerd进程
    b. 世界服通知wcenterd执行:
       - "server.startNewCenter" → 注册centerd服务
       - "server.start" → 执行server.load初始化
    
  4. 服务同步阶段

    -- wcenter/center/server/server.lua
    -- Server.load完成后:
    a. 通过Server:onSync()通知世界服OnEndSync
    b. 世界服通知登录服和游戏服:
       - 更新服务器状态
       - 允许游戏服重连
    
  5. 组初始化

    ServerMgr:makeWgameGroup()
    a. 执行各模块的load方法二次初始化
    

关键注意点

  1. centerd 初始化
    • startAllServers()阶段最易因玩家数据量过大导致初始化失败
  2. 冗余保护
    • stopWorld中二次执行stopAllServer保证服务终止可靠性
  3. 节点管理
    • 通过 etcd 配置校验保证节点配置一致性

国内/海外特殊处理

  • 启动流程差异
    • 国内/海外节点需分别加载区域配置文件(如 IP 白名单、合规策略)
    • 通过etcdregion字段区分服务分组
  • 数据库隔离
    • 国内/海外使用独立数据库实例,需在Server.load阶段动态切换连接配置

附录

常见问题

  1. stopAllGame后仍有玩家在线
    • 检查 wgamed 是否未正确执行stopServer
  2. centerd 启动失败
    • 确认数据库连接池大小
  3. etcd 配置未同步
    • 执行强制同步:curl -X POST http://127.0.0.1:10000/syncEtcd

更新说明

  1. 补充国内/海外特殊处理章节
  2. 增加附录-常见问题
  3. 优化文档层级结构,修复格式中断问题





服务器启动流程图

启动服务器
节点启动阶段
节点调用world的nodeStart
校验etcd配置并更新差异
节点初始化
执行各模块load方法
服务启动核心
assignServer分配centerd进程
通知wcenterd注册服务
执行server.load初始化
服务同步阶段
通过onSync通知世界服
更新服务器状态
组初始化
执行模块二次load
启动完成
⚠️ 关键风险点:centerd初始化可能因玩家数据量过大失败

服务器关闭流程图

关闭服务器
执行stopAllGame
禁止新登录/重连
通知wcenterd停止服务
清除world数据
执行stopWorld
更新etcd配置
冗余执行stopAllServer
关闭所有节点服务
通知登录服/游戏服stop
终止nonamed/wnoamed进程
关闭完成
🔒 冗余保护:二次执行stopAllServer确保服务终止

流程图使用说明

  1. 颜色标注

    • 红色框(critical):标识高风险操作(如centerd初始化
    • 绿色框(redundant):标识冗余保护操作(如二次执行stopAllServer
    • 黄色备注框(noteclass):补充关键说明
  2. 参数调整

    • 等待间隔时间(等待N秒)需根据实际业务设置(建议 10-30 秒)
    • 节点关闭顺序(终止nonamed/wnoamed进程)需与服务器架构严格匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值