Skynet服务端框架搭建1-方案设计
首先明确需要做的是什么东西,在客户端和服务端之间需要实现什么东西,各个功能如何各司其职
服务端整体结构
服务端结构如下所示,每个节点被划分为两部分,其中虚线部分是本地服务,其他的为全局服务
其中本地服务在单个节点内是唯一的,但是它不具备全局唯一性的服务,比如上图中接地那1和节点2都有gateway,每个节点都能开,且是各自独立的
全局服务则是所有节点都具有唯一性的服务,比如图中的agentmgr,可以部署在节点1也可以部署在节点2,但无论如何所有节点只能开启一个
各服务的功能
gateway
这个名词都很眼熟了,就是用于处理客户端连接的服务。客户端连接某个网关(gateway),如果玩家没登录,网关会把消息转发给节点内的登录服务器用于处理账号校验的操作,如果登录成功,则把消息转发给客户端对应的代理agent,一个节点也可以开启多个网关来分摊性能。
login
就是登录服务了,来处理登录逻辑,比如账号校验,同样可以开启多个登录服务来分摊性能
agent
代理,每个客户端会对应一个代理服务用于处理对应的角色逻辑(跟erlang一个节点对应一个玩家的逻辑基本相似),处于性能考虑agent必须与它对应的客户端连接。
agentmgr
管理代理的服务,记录所有agent节点以及账号对应的关系
nodemgr
节点管理,监控性能
scene
场景服务,处理战斗逻辑,每一局游戏由一个场景服务器负责
消息流程
可以再看看客户端和服务端之间是如何消息交互的
比如我们的登录过程:在①阶段客户端连接到某个gateway然后发送登录协议,gateway转发给login②,校验成功后,agentmgr创建与客户端对应的agent③④完成登录,如果该玩家在其他节点登录则会由agentmgr把另一边踢下线。
游戏过程:登录成功后客户端消息由gateway转发给对应的agent⑤,agent处理玩家逻辑。
设计的初衷
很多服务端都有网关gateway的存在,用于隔离客户端和服务端,如果客户端修改了协议,则只需要更改gateway,服务端内部的逻辑不受影响。