继上一篇介绍了的分布式游戏服务器架构,后面的课程我们将对于架构中的每一种服务和具体技术细节进行详细介绍。
首先回顾下游戏服务器架构中的列出的服务,包括:
网关服务器
中心服务器
单区服务器
跨区服务器
镜像服务器
今天我们来介绍游戏服务器架构中至关重要的服务:网关服务器。
服务描述:即用于维持玩家客户端的连接,将玩家发的游戏请求转发到具体后端服务的服务器。
功能特性:
1. 对外开放:即客户端需要知道网关的IP和端口,才能连接上来;
2. 统一入口:架构中可能存在很多后端服务,如果没有一个统一入口,则客户端需要知道每个后端服务的IP和端口。
3. 请求转发:由于统一了入口,所以网关必须能将客户端的请求转发到准确的服务上。
4. 无感更新:由于玩家连接的是网关服务器,只要连接不断;更新后端服务器对玩家来说是无感知的,或者感知很少(根据实现方式不同)。
一般情况下,有了以上4个特性,这个网关就可以用了。
但是如果只有上面4个特性,我们用Nginx做为网关也是可以的,为什么还需要自己做网关?
因为我们的游戏网关还需要具备以下特殊功能:
特殊功能:
1. Session认证:即能维护客户端是否登录成功的状态,对于未登录的请求,不予以转发,从而预防恶意攻击。
2. 流量限流:游戏经常会遇到DDOS攻击,一个客户端可以通过一个for循环一直给你发请求,所以必须进行限制。
3. 踢下线:游戏维护时,为了让玩家能更新补丁,会将玩家踢下线,重新走一遍登录流程,避免客户端与服务端的数据不一致,造成显示上的BUG。此外客服也需要经常对一些违规的玩家进行踢下线处理。
4. 在线统计:为什么网关来做在线统计呢?因为只有它有所有的玩家连接信息,所以可以轻松统计当前有多少玩家在线。
5. 协议加密:为了避免客户端的恶意攻击,我们需要将请求进行加密,由于统一了入口,所以网关来做非常容易。
6. 心跳检测:用于检测客户端是否已经掉线,一般超过几分钟没有收到心跳请求,则认为客户端已经掉线,直接请求登录数据,让玩家重新走登录流程。
集成以上的功能后,便形成了以下网关服务架构图:
这张图中的路由控制,会根据不同游戏类型会有所变动,其中:
1. 后端服务路由表:维护了后端当前有哪些服务注册到网关了,以及服务对应哪些区服的配置信息。
2. 区服注册表:维护了当前开了哪些区服及区服信息。
3. 终端管理:所有连接上网关的设备或进程都被认为是一个终端,终端会有一个编号,这个编号对应后端服务编号或者玩家编号。当需要转发消息给后端服务或客户端时,就需要从终端管理里找到具体的连接进行消息发送。
接下来用图示介绍一下,客户端、网关服务器、后端服务器的交互流程:
Step1:客户端连接网关服务器,然后发送登录请求给网关;
Step2:网关直接将登录请求转发给对应区服的后端服务器进行登录验证;
Step3:后端服务器验证成功后,会返回登录信息给网关;
Step4:网关会根据登录信息维持一个Session映射,用于安全验证和重登判断,然后转发登录信息给客户端;
Step5:客户端收到登录成功消息后,就可以发送业务请求给网关了;
Step6;网关收到业务请求后,会先判断玩家是否登录过,登录过的才转发给后端服务器,并且在协议头增加玩家标记;
Step7:后端服务器收到业务请求后,根据协议头的玩家标记,找到玩家的数据进行业务处理,然后返回给网关;
Step8:网关收到业务回复后,直接返回给客户端;
PS:上面涉及到的一些关键技术细节,如:流量限流、协议加密,将会在后续的文章中详细介绍算法。