OpenMir2 传奇游戏服务器:把六个服务串起来跑通登录链路的最小路径
【免费下载链接】OpenMir2Legend of Mir 2 Game server项目地址: https://gitcode.com/gh_mirrors/op/OpenMir2
学 MMORPG 服务端架构,资料往往是伪代码和框图,能真正跑起来的 C# 示例很少。OpenMir2 是一套用 C# 实现的《热血传奇》游戏服务器,账号登录、角色选择、实时战斗、数据持久化共六个服务,按依赖顺序拉起来,客户端就能完整登录进图。
🧩 从环境到启动:六个服务的部署顺序
依赖很少:.NET 6 SDK和MySQL 5.7+,客户端(Delphi 编译的 mir 客户端)自备。
- 获取代码并初始化数据库,三个 SQL 文件顺序不能乱:
git clone https://gitcode.com/gh_mirrors/op/OpenMir2 cd OpenMir2 mysql -u root -p mir2_db < sql/mir2_db.sql mysql -u root -p mir2_account < sql/mir2_account.sql mysql -u root -p mir2_data < sql/mir2_data.sqldotnet build OpenMir2.sln构建整个解决方案。- 改数据库连接:DBSvr 首次运行会在输出目录生成
dbsvr.conf,只需要动这一行:
[DataBase] ConnctionString = server=127.0.0.1;uid=root;pwd=你的密码;database=mir2_db;- 按依赖顺序分终端启动:DBSvr → LoginSvr → GameSvr → GameGate → SelGate → LoginGate。端口分配是固定的,客户端连的就是前三个网关:
| 服务 | 默认端口 | 职责 |
|---|---|---|
| LoginGate | 7000 | 客户端登录入口,账号注册/校验 |
| SelGate | 7100 | 创建、删除、选择角色 |
| GameGate | 7200 | 进图后的封包转发、反作弊过滤 |
| DBSvr | 6000 | 玩家数据读写(5100 为内部网关端口) |
| LoginSvr | 5600 | 账号服务,由 DBSvr 的 IDSPort 指向 |
🔍 一次登录请求:它依次穿过哪些服务
跟着一个玩家的动作走一遍,比看模块清单清楚得多。
- 输账号密码:客户端连 LoginGate 的 7000 端口,校验请求转发给 LoginSvr,再由 DBSvr 落库到账号库。
- 角色界面:换 SelGate 接管,建角色、删角色全部经它转发 DBSvr,登录和游戏逻辑完全不参与。
- 进图之后:连接切到 GameGate(7200 起,可开多个
7200+i),走路、攻击、施法的封包经它转给 GameSvr;GameSvr 里M2Server库承载角色、地图、怪物的核心逻辑,玩家数据变化再经 DBSvr 写回 MySQL。
拆成六个服务的取舍主要有两条:
- 网关前置:会话超时、封包大小限制、加速外挂检测(
src/GameGate/Conf/GateConfig.cs里一整排IsAttackInterval之类开关)都在边缘进程处理,游戏逻辑进程不用碰裸 TCP 细节;网关挂了不拖累逻辑,逻辑重启客户端重连即可。 - 数据层单独抽走:服务间全走 TCP 私有协议(
src/M2Server/Net/TCP/TCPNetChannel.cs),不走 HTTP,延迟低且 DBSvr 可以独立扩存储后端。
🛠️ 动手术指南:调优、加地图、换存储
连接池:在dbsvr.conf的连接串尾部追加Pooling=true;Min Pool Size=10;Max Pool Size=100,在线人数上去之后数据库往返的开销会明显下降。
网关限流与封加速:默认参数在src/GameGate/Conf/GateConfig.cs构造函数里(MaxClientCount=50、MessageWorkThread=1),运行时由配置文件覆盖。玩家被误判加速,调大AttackInterval、MoveInterval或把PunishIntervalRate往 1.0 以上放。
日志:各服务appsettings.json里的 Serilog 配置默认偏细,线上把MinimumLevel从 Debug 调到 Information,再按需指向 Seq(localhost:5341)。
新增地图和怪物:
- 地图模型与可行走点在
src/M2Server/Maps/,加载逻辑在src/GameSrv/Maps/MapManager.cs,刷怪线程在src/GameSrv/Word/Threads/GeneratorProcessor.cs; - 怪物行为类在
src/M2Server/Monster/Monsters/,加一种怪就是加一个派生类并在数据表登记属性与掉落。
挂新模块:Modules/ScriptEngine/跑自定义游戏脚本,Modules/GameCommand/Commands/下每个文件就是一条 GM 指令,照AddGoldCommand.cs的样子复制一份就能加自己的命令。
换存储后端:dbsvr.conf里[DataBase]段的Storeage项默认MySQL,改为 Mongo 后实现对应src/Storeages/DBSvr.Storage.MongoDB/里的读写,MySQL 实现参照src/Storeages/DBSvr.Storage.MySQL/PlayDataStorage.Save.cs。
🐛 翻车记录:四个高频卡点
- 现象:客户端登录界面卡住或提示连接超时。根因:LoginGate 没启动,或防火墙没放行 7000 端口。解法:
netstat -ano确认 7000/7100/7200 都在监听,放行对应端口。 - 现象:DBSvr 启动后反复报数据库连接失败。根因:
dbsvr.conf的ConnctionString还是默认空密码,或sql/下脚本没导入。解法:重跑三个 SQL 文件,改对 uid/pwd 后重启 DBSvr。 - 现象:能登录,但角色列表空白、建角色报错。根因:SelGate 依赖 DBSvr,DBSvr 又要先连上 LoginSvr(5600),启动顺序乱了。解法:严格按 DBSvr → LoginSvr → GameSvr → 三个网关的顺序拉起。
- 现象:角色移动、攻击一卡一卡,甚至被提示"关闭加速外挂"。根因:GameGate 的动作间隔默认值偏严(移动 570ms、攻击 900ms),客户端帧率低时触发惩罚。解法:把对应间隔调大或放宽
PunishBaseInterval,再观察是否复现。
收尾
六个服务读下来能带走三件事:网关与游戏逻辑怎么分离、服务间 TCP 协议怎么设计、数据层怎么可替换。下一步建议顺着src/GameSrv/Word/的 tick 循环和src/M2Server/Net/的封包结构往下拆。
【免费下载链接】OpenMir2Legend of Mir 2 Game server项目地址: https://gitcode.com/gh_mirrors/op/OpenMir2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考