游戏服务器框架

——蔡剑彬 C++服务器开发工程师([email protected])

最简单的服务器莫过于在一个while循环里面不停地accept新的sockset,然后做相应的处理。虽然个人是比较推崇简单的事物,毕竟简单才是终极的复杂。但是如果那样做,在实际应用中就难免不适用。

所以,在不把服务器变得十分复杂的前提下,一步步地从一个while循环拓展为能够适用于实际情况的服务。

首先,先确定下游戏服务器的类别,玩游戏的时候一般操作都是点击客户端某个地方,然后等待相应的反应,这种就是应答式服务器(C/S)。应答式服务器核心部分,就是消息通信,需要双方指定要一套协议,然后客户端发送相关的协议ID,以及各种数据,这些数据我是通过Json包来装载。接着服务器接收到消息后,解析Json包,然后做相应的处理,再根据情况需要返回一个结果给客户端。

然后,按照游戏逻辑来将整个while循环服务器划分为若干个能够异步通信的服务器。

玩游戏的流程一般都是这样:注册游戏账号->登陆游戏->玩游戏->退出游戏。这个基本流程可以分为两个功能:管理账号信息和处理玩游戏的逻辑,那么就按这个逻辑将一个while循环服务器划分为两个while循环服务器,分别是登陆服务器(LoginServer)和逻辑服务器(LogicServer)。如图1所示。

图1 登陆服务器和逻辑服务器

客户端连接到LoginServer,进行注册、登陆等功能,LoginServer把玩家的账号信息保存到数据库中。玩家登陆成功之后,LoginServer就通过服务器间的中间层,将玩家的Socket、玩家账号、角色ID等等基本信息发给LogicServer,那么LogicServer就能够发消息给玩家了。而玩家每次要发消息给LogicServer得先把消息给LoginServer,由LoginServer转发给LogicServer,毕竟玩家连接的服务器是LoginServer而不是LogicServer,所以也只能这样了。LogicServer就负责游戏的业务逻辑实现,以及将玩家在游戏过程中产生的数据保存到数据库中。

(注:关于服务器如何与数据库通信,这里简单讲一下。我用的数据库是MySql,服务器是用C++写的,MySql提供了C接口,供程序调用,调用相关接口就能够连接到数据库,并且往数据库读写数据。)

接着,在仔细分析,如果在LogicServer中直接访问数据库,也就是有处理数据保存的动作。那么处理业务逻辑的时间在人数多一点的情况下肯定不够了,这时候就应该把游戏数据管理的功能分出来,由另外一个服务器(DBServer)负责。LogicServer就专注于业务逻辑的实现,一旦有数据需要保存,就马上发消息给DBServer,让它把数据保存到数据库中。现阶段服务器如图2。

图2 分离游戏数据管理功能图

现阶段暂时没什么问题了,但是如果仔细思考LoginServer的功能,是否觉得消息转发的功能不适合放在数据管理账号的服务器呢?而且,将能够直接操作数据库的服务器呈现给客户端是否会引起安全危机呢?以上两个问题是肯定的,所以,为了解决这个问题,需要引入一个能够承担消息转发功能以及保证信息安全的服务器。在日常上网时,有“网关”这么一个东西,负责的事务很符合我们的需求。因此,引入一个网关服务器(GatewayServer),将LoginServer的消息转发功能分离出来,并在与Client连接时判断玩家的信息是否正常,不正常的均不给于登陆。引入网关服务器后的架构图如图3所示。

图3 添加网关服务器图

现在整个服务器的架构接近完美了,但是还少了点东西,如果服务器在运行中出问题了,该怎么判断哪里出问题了呢?问题回溯该怎么做?为了解决这一问题,需要引入一个日志服务器(LogServer),用来记载服务器的日常操作。最终服务器的架构如图4所示。

图4 服务器完整架构图

这个服务器架构是比较实用的,逻辑处理均在各自的while循环中,可以看成是单线程服务器,避免了多线程服务器竞争资源而消耗时间的问题,实际实用情况也表明安全性和稳定性都不错。缺点就是并发量不足,多个用户同时注册登录时,会有登录不上的现象发生,在新开服的前几天,该现象比较严重,可以利用负载均衡技术来解决这个问题。

既然提到负载均衡技术,那就顺便就提一下DNS负载均衡(负载均衡技术的一种)。开启多个LoginServer用于处理大量玩家注册登录的业务,添加一个DNSServer,用于管理多个LoginServer,判断当前负载最小的LoginServer,然后将事务处理分发给该LoginServer,让所有LoginServer的负载均保持在一个平衡状态。DNS负载均衡如图5所示。

图5 DNS负载均衡图

这篇文章只是简略地介绍服务器的架构,以及负载均衡技术,也算是对这个月在服务器方面的学习总结,至于各个模块的详细讨论,会在后续逐渐写出来。

时间: 2024-10-03 15:48:03

游戏服务器框架的相关文章

游戏服务器框架:Leaf/go

Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率并追求极致的开发效率.Leaf 适用于几乎所有的游戏类型.其主要的特性: 良好的使用体验.Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 稳定性.Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 多核支持.Leaf 通过模块机制和 leaf/go 尽可能的利用多核资源,同时又尽量避免各种副作用 良好的模块支持. 一个 Leaf 开发的游戏服务器由多个模块组成(例如 LeafServer),模块有以下特点

【前言】为什么要设计游戏服务器框架

设计游戏服务器框架: 项目设定周期:7月1日 - 12月31日 项目语言:PHP.Golang 项目成果: 1.PHP版游戏服务器框架 2.Golang版游戏服务器框架 设计目的: 1.挑战自己的毅力,遇到困难,勇敢面对解决 2.学习未涉及的领域和技术

Leaf - 一个由 Go 语言编写的开发效率和执行效率并重的开源游戏服务器框架

转自:https://toutiao.io/posts/0l7l7n/preview Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架.Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器. Leaf 的关注点: 良好的使用体验.Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 稳定性.Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 多核支持.Leaf 通过模块机制和 leaf

游戏服务器框架与互联网产品的认识

[info:文章出自个人网站 www.wilson-loo.com] 游戏服务器框架与互联网产品的认识 我以前进入要玩,其实很大一部分工作还是在提升c++的编程技能.多进程通信.游戏逻辑 这几方面的学习研究:整个人的视野和思维还定位于程序开发 和 程序设计:说的简单点,就是如何将一个程序代码写好,没有机会.时间和精力 扩宽认知视野和深度. 离职后,接触了游戏开发和互联网 两大领域的面试.在游戏开发方面,会更多涉及服务器框架,也就是端游的框架啊,加一些脚本啊,用一些现成的框架:还好,主要能够知晓数

教你从头写游戏服务器框架

本文由云+社区发表 作者:韩伟 前言 大概已经有差不多一年没写技术文章了,原因是今年投入了一些具体游戏项目的开发.这些新的游戏项目,比较接近独立游戏的开发方式.我觉得公司的"祖传"服务器框架技术不太适合,所以从头写了一个游戏服务器端的框架,以便获得更好的开发效率和灵活性.现在项目将近上线,有时间就想总结一下,这样一个游戏服务器框架的设计和实现过程. 这个框架的基本运行环境是 Linux ,采用 C++ 编写.为了能在各种环境上运行和使用,所以采用了 gcc 4.8 这个"古老

腾讯高级工程师:如何从头开始写游戏服务器框架_转

转自: 腾讯高级工程师:如何从头开始写游戏服务器框架 本文作者:韩伟,腾讯互娱高级工程师,目前在 Next 产品中心研发创新类型游戏. 前言:从去年开始作者投入了一些具体游戏项目的开发,这些新的游戏项目,比较接近独立游戏的开发方式.在这个过程中,作者从头写了一个游戏服务器端的框架,以便获得更好的开发效率和灵活性.因此这篇文章便是该项目服务器框架的设计和实现过程的总结. PS:框架的基本运行环境是 Linux ,采用 C++ 编写.为了能在各种环境上运行和使用,采用了 gcc4.8 这个“古老”的

c++游戏服务器框架

1.skynet是一个开源的,轻量级的,为在线游戏服务器打造的框架 https://github.com/cloudwu/skynet 2.muduo是一个基于 Reactor 模式的 C++ 网络库 https://github.com/chenshuo/muduo/ 3.boost asio 是一个异步的网络框架 官网:http://www.boost.org/ http://sourceforge.net/projects/boost/files/ 第三方教程 http://theboos

游戏服务器框架概括分析

这篇blog题目涉及的范围真大!以至于在这里需要先写一篇前言把范围缩小.选择写这样一个系列的文章,主要是想给工作了两年的自己一个交代,或者说是一个阶段性的总结.两年时间里,房价依然再涨,工资依然跑不赢CPI,某人依然在仰望星空.期间很多梦碎了,很多还在坚持着,生活过得波澜不惊.而我也从刚毕业是的青涩逐步蜕变为"老油条".不知道是一种悲哀.还是一种悲哀.还是一种悲哀....... 庆幸的是梦还在继续,一颗倔强的心还在坚持.希望明天的明天被束缚的心能回到梦开始的地方! ==========

游戏服务器框架分析

一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块. 这里说的模块可以指一个进程,或者一个线程方式存在,本质上就是一些类的封装. 对于服务器的并发性,要么采用单进程多线程,要么采用多进程单线程的方式,说说两种方式的优缺点: 一.单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程: 网络通讯层,业务逻辑,数据存储,分别在独立的线程中,无守护进程. 优点: 1.数据共享和交换方便,使用全局变

游戏服务器框架之网关

当用户在大厅登陆成功之后,大厅会分配一个网关的地址给客户端.客户端与这个网关建立长连接,负责与服务器的通信.网关的主要功能有: 消息解析 消息合法性验证 转发消息到业务服务 流量限制 版本验证等. 一般的功能都可以随便添加.这里主要说一下消息转发.对于客户端和业务服务来说,网关是一个承上启下的作用.首先客户端与网关建立连接,第二,网关收到客户端的一请求请,得知道把这条请求发送到哪个业务服务上面,第三,业务服务处理完一个请求,如何把消息返回给网关,网关再如何把消息发给客户端. 一,客户端与网关建立