从0开始的Unity3D游戏开发 v0.1.17 分布式服务端

发布于 2018-08-23  1237 次阅读


本篇内容为:基于ET3.2斗地主DEMO得出的,对实现分布式服务器的理解

所谓的分布式服务器,是很多台服务器(PC/App)共同完成一个Server的任务。
所以我们现在有了1个Realm,N个Gate,N个Map,或许还有N个Macth服务器。
Realm(内/外):玩家的初次连接对象,实际上可能存在多个,但是对于单个玩家来说他只会遇到其中一个。
Gate(内/外):消息转发服务器,直接处理玩家的请求和转发Actor消息。
Map(内):游戏逻辑服务器,内部运行整体游戏逻辑。
Match(内):匹配服务器,在玩家更换游戏地图时,通知Gate更新ActorID。

为了实现以上逻辑,需要满足以下条件:
无论Gamer在哪个Map上,只要ActorID正确,Gate一定能完成转发任务;
能一键发布服务端;

编辑配置文件

复制粘贴ET中的默认配置LocalAllServer.txt中的字符串。
有多少个app就复制多少个就好;
依次设置OuterConfig中的2个IP/InnerConfig中的1个IP/AppId/AppType
所有参数都有一一对应关系,这里没有多少可以自由设定的空间。

开机启动分布式服务端

添加启动项

编辑文件vim /etc/rc.local
这里假设我们分布式服务端有6个app
添加后台任务,系统启动后将依次后台运行每个sh脚本:
nohup /root/Server/DB/app1DB.sh &
nohup /root/Server/Realm/app2Realm.sh &
nohup /root/Server/Location/app3Location.sh &
nohup /root/Server/Gate1/app4Gate1.sh &
nohup /root/Server/Gate2/app5Gate2.sh &
nohup /root/Server/Map1/app6Map1.sh &
nohup /root/Server/Map2/app7Map2.sh &

编辑sh脚本

#! /bin/sh
cd /root/Server/DB/publish
dotnet App.dll --appId=1 --appType=DB --config=../AllServer.txt

将当前目录设置为程序的运行目录;
运行App.dll,指定运行参数。
所有的app照这个格式重复一遍。
通过以上操作,服务端实现了开机10秒后自动运行App.dll。

客户端修改服务器IP

修改GlobalProto.txt中Address的地址为Realm服务器的外网IP;
例如:118.89.50.112:10006

运行客户端上的DEMO,应该能正确登陆服务器了。

多Realm服务器的假设

如果有一个需求:玩家可以从多个Realm服务器中选择一个网络连接情况最好的服务器。
那么就需要设置多个Realm来实现了。(应对墙)
而ET中的默认设置,只有Gate/Map类型的服务器才有复数的配置和对应的配置词典。
所以,要实现多个Realm,就得修改配置组件。
修改后的组件在使用时,给Realm服务器发消息就需要从词典里面找到指定编号的服务器。

但是为了方便版本迁移,不建议修改太多除了Server/App/Program.cs以外的文件
最好是Hotfix和Model下各建一个自定义文件夹,有了新版本ET直接复制粘贴过去升级完成。

聊天服务器与跨服匹配服务器

聊天服务器实现用户加入一个聊天频道的功能,用一个列表排序所有消息,将新消息广播即可。
跨服匹配服务器实现用户加入一个副本匹配队列,匹配成功后切换Map服务器的功能。这部分的实现会稍微麻烦一些,进出房间/开始结束游戏都会有状态改变,处理离线重连也面临“恢复玩家数据”的问题。
当然,并不是一定要弄五花八门的服务器不可,单个Map也能处理所有游戏逻辑。


关注成长,注重因果。