拆一套 MMO 的三层服务器:GCC / GAS / DBS 各管什么

服务端架构 · 2026-09-02 · datanger.cn

把一个经典老 MMO 重新跑起来,第一步不是写新代码,而是弄清它原本的服务器拓扑。这套 2003 年的架构是标准三层:客户端永远只连 GCC(网关集群控制器,GacPort 6000),场景逻辑全部在 GAS(区域服务器,6010)上跑,落库走 DBS(数据库服务器,6023)。三层各自是独立进程,互不引用,靠一套自定义 TCP 协议串起来。

一次性 Key 认证

客户端登录 GCC 拿到的不是会话 cookie,而是一个一次性 Key:拿 Key 去和 GAS 换场景入场资格。这意味着认证必须经过 GCC——你没法绕过网关直连区域服务器,因为 Key 只在 GCC 与 GAS 之间流转有效。这套设计今天看也不过时。

AllowedClients 白名单

每一层的配置里都有 AllowedClients:GAS 只接受 GCC 的连接,DBS 只接受本机的 GCC/GAS。本机化部署时所有白名单保持 127.0.0.1,只有 GCC 的监听口对外。端口矩阵一目了然:

客户端 ──► GCC :6000   (唯一对外端口)
GCC   ──► GAS :6010   (本机环回)
GCC/GAS ─► DBS :6023   (本机环回)

InnerAddress / OutterAddress 分离

每层配置里有两个地址字段,语义极易混淆:InnerAddress 是 bind 地址,OutterAddress 是对外通告地址。云上部署的正确姿势是 Inner 设 0.0.0.0 监听全部网卡、Outter 设公网 IP——客户端拿到的转发目标永远是通告地址。把这两个当成同一个东西,是部署翻车的头号来源。

经验:架构梳理阶段先画出「谁监听哪个端口、谁允许谁连进来」的矩阵,再动任何配置。后面所有的 IP 迁移、域名化,都只是改这张矩阵。