从事游戏开发已经有一段时间,一直想写一套属于自己的通讯框架,可迟迟没有动手。
前阵子时间相对充裕,就在网上找了一些服务端架构方面的资料看了下,借鉴以前的游戏通讯引擎,通过研究学习,自己也写出了一套通讯框架,经过验证,可以正常与AS、C++良好的进行通讯。
框架完成后,又闲置了一阵子,一直没有时间继续完善,最近在弄些分布式的东西,于是又想了之前写好的通讯框架,在此总结下实现,以及期间遇到的问题。
下面说说一些相关的设计:
1 技术说明
Ø JDK版本,采用1.6
Ø 基于apache-mina NIO框架
Ø 采用TCP/IP协议,长连接的方式
Ø 与客户端数据交互,采用字节数组
Ø 报文格式:定长报文头(如:协议头1字节,数据为4字节)
Ø 持久化方面,采用mysql数据库,版本5.5
Ø 数据源采用c3p0数据源
2 服务器架构设计
2.1 现阶段服务器架构分类
服务器组的架构一般分为两种:第一种是带网关服务器的服务器架构;第二种是不带网关服务器的服务器架构,这两种方案各有利弊。在给出服务器架构设计之前,先对这两种设计方案进行详细的探讨。所谓网关服务器,其实是Gate 服务器,比如GateServer1等。网关服务器的主要职责是将客户端和游戏服务器隔离,客户端程序直接与这些网关服务器通信,并不需要知道具体的游戏服务器内部架构,包括它们的IP、端口、网络通信模型(完成端口或Epoll)等。客户端只与网关服务器相连,通过网关服务器转发数据包间接地与游戏服务器交互。同样地,游戏服务器也不直接和客户端通信,发给客户端的协议都通过网关服务器进行转发。
2.2 服务器构架方案
根据网络游戏的规模和设计的不同,每组服务器中服务器种类和数量是不尽相同的。本系统设计出的带网关服务器的服务器组架构如图1 所示。
图1 带网关服务器的服务器架构设计方案
该设计有以下几点好处:
1、GateServer作为网络通信的中转站,负责维护将内网和外网隔离开,使外部无法直接访问内部服务器,保障内网服务器的安全,一定程度上较少外挂的攻击。
2、网关服务器负责解析数据包、加解密、超时处理和一定逻辑处理,这样可以提前过滤掉错误包和非法数据包。
3、客户端程序只需建立与网关服务器的连接即可进入游戏,无需与其它游戏服务器同时建立多条连接,节省了客户端和服务器程序的网络资源开销。
4、在玩家跳服务器时,不需要断开与网关服务器的连接,玩家数据在不同游戏服务器间的切换是内网切换,切换工作瞬间完成,玩家几乎察觉不到,这保证了游戏的流畅性
和良好的用户体验。
虽然网关服务器带来上述好处,但是,还需要注意以下可能导致负面效果的两个情况:如何避免网关服务器成为高负载情况下的通讯瓶颈问题以及由于网关的单节点故障导致整组服务器无法对外提供服务的问题。上述两个问题可以采用“多网关”技术加以解决。顾名思义,“多网关” 就是同时存在多个网关服务器,比如一组服务器可以配置三台GateServer。当负载较大时,可以通过增加网关服务器来增加网关的总体通讯流量,当一台网关服务器宕机时,它只会影响连接到本服务器的客户端,其它客户端不会受到任何影响。从图1 的服务器架构图可以看出,一组服务器包括GateServer、GameServer、FightServer、MailServer、LogServerS和PaltformServer 等多种服务器。GateServer 就是网关服务器,一般一组服务器会配置3 台GateServer,因为稳定性对于网络游戏运营来说是至关重要的,而服务器宕机等突发事件是游戏运营中所面临的潜在风险,配置多台服务器可以有效地降低单个服务器宕机带来的风险。另外,配置多台网关服务器也是进行负载均衡的有效手段之一。其中,各种服务器的主要功能和彼此之间的数据交互情况如下。
(1)LoginGate
LoginGate 主要负责在玩家登录时维护客户端与LoginServer 之间的网络连接与通讯,对LoginServer 和客户端的通信数据进行加解密、校验。
(2)LoginServer
LoginServer 主要功能是验证玩家的账号是否合法,只有通过验证的账号才能登录游戏。从架构图可以看出, GameServer 会连接LoginServer。玩家登录基本流程是,客户端发送账号和密码到LoginServer 验证,如果验证通过,LoginServer 会给玩家分配一个Sessi