笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
在上篇学习游戏服务器基础篇中给读者介绍了如何学习游戏服务器,主要针对的是想学习游戏服务器编程的开发者。学习服务器编程,也是一个循序渐进的过程,学习知识还是要用于实践开发的,实践开发的最好方式就是去公司参与项目开发,这样才能真正的锻炼自己的技能。本章介绍一下在知名IT公司中通常使用的游戏服务器架构设计,以及它们的编写处理方式。
一款成熟的游戏服务器,它的技术是建立在成熟产品上的,也就是说经历过上线产品验证的服务器都是可以学习的。服务器的设计其实比较复杂,本篇文章主要是介绍两种服务器,这两种服务器都是经过成功产品验证过的,一种是不带有负载均衡的,另一种是带有负载均衡的服务器,这里给读者一一介绍。
第一种服务器是不带有负载均衡的,先介绍一下服务器的基本结构,直接看图如下所示:
这种架构的服务器在很多IT公司使用,它是针对的MMORPG或者MMORAPG大型游戏设计的,带有场景服务器的,这里的场景服务器,可以继续分解出Fight服务器以及其他服务器。先介绍各个功能服务器:
CenterServer 服务器管理器,管理所有的服务器,分配服务器的端口, 负责全局的逻辑
DBServer 角色档案cache服务器
GameServer 逻辑服务器
GateServer 网关服务器,负责消息转发
LoginServer 登录服务器, 连接账号数据库,检测用户名和密码
再介绍服务器的基本流程:用户从客户端选择游戏服务器列表,登录到LoginServer,在这个过程中先去平台服务器进行帐号的验证是否正确,通过后会通知LoginServer,然后LoginServer把验证正确的信息发送消息到CenterServer, 请求其中的GateServer的地址和端口,CenterServer找一个可用的GateServer的信息, 发送回LoginServer。LoginServer再把消息发送给客户端,然后客户端断开与LoginServer的链接,然后在与GameServer服务器链接进入到游戏场景中。
在这里注意的是GateServer与GameServer是一对一的关系,换句话说,每个GameServer能容纳的玩家数量是一定的,一旦达到GameServer的最高峰值,它就会找下一个GateServer对应的GameServer,各个GateServer服务器之间是不通信的。当然玩家的实时同步是在GameServer服务器中实现的,实时同步在服务器中的处理也是游戏服务器中的核心技术点,后面会结合着代码讲解。接下来介绍具有负载均衡服务器,先看图如下所示:
负载均衡服务器与没有负载均衡服务器之间的区别是GateServer与GameServer之间的关系,没有负载均衡的服务器GateServer与GameServer之间是一对一的关系,而且各个GateServer之间是不通的。正常情况下一个GateServer对应一个GameServer实时在线人数能达到3000人以上。具有负载均衡的服务器,一个GateServer对应多个GameServer,而且最重要的一点是多个GateServer之间可以互相通信。而且可以随意扩展,通过配置文件既可以实现配置。配置文件事例如下所示:
"TableIndex" : [ "CenterServer", "LoginServer", "GateServer", "GameServer", "DatabaseServer" ], "CenterServer" : { "UUID" : 0, "Group" : 0, "ServerType" : "Single", "ListenPort" : 30000, "mysql" : "mysql://root:123456@192.168.1.11:3306/gamedata" }, "LoginServer" : { "UUID" : 1, "Group" : 0, "ServerType" : "Single", "ListenAddr" : "192.168.1.11", "ListenPort" : 30100 }, "DatabaseServer" : { "UUID" : 2, "Group" : 0, "ServerType" : "Single", "ListenAddr" : "192.168.1.11", "ListenPort" : 30200, "mysql" : "mysql://root:123456@192.168.1.11:3306/gamedata" }, "GateServer" : { "UUID" : 10, "Group" : 0, "ServerType" : "Multiple", "ListenAddr" : ["192.168.1.11"], "ListenPort" : [ 30300], "ServerProxy" : [ "GameServer" ] }, "GameServer" : { "UUID" : 20, "Group" : 0, "ServerType" : "Multiple", "ListenAddr" : ["192.168.1.11"], "ListenPort" : [ 30400], "ServerProxy" : [ "DatabaseServer", ] }
网络消息传输建议使用Google开源的库Protobuf-net,使用文本文件定义的消息结构体,可以通过它自带的工具转化成C#和C++,然后将生成的文件放到工程中直接调用所定义的结构体即可。
最后,如果读者感兴趣可以学习开源框架Node.js,这个对于初学者门槛比较低,它也可以处理负载均衡问题,网上参考资料非常多。后面会介绍各个服务器的代码编写以及核心模块的介绍实现。
敬请期待。。。。。。。。
原文:http://blog.csdn.net/jxw167/article/details/54691214