网关服务器 gate
一个应用的gate一般不参与RPC调用,也就是说其配置项里可以没有port字段,仅仅有clientPort字段,它的作用是做前端的负载均衡。
客户端往往首先向gate发出请求,网关会给客户端分配具体的connector。具体的分配策略一般是根据客户端的某个key做hash得到connector的ID,这样就可以实现各个connector的负载均衡。
gate知识扩展:
- gate通俗来讲就时消息达到服务器的第一关,负责与client建立连接,接收client发送过来的消息,并对消息进行验证、分发等。不同服务系统gate负责的功能不太一样,但本质是不变得。
- gate用于维持用户client连接,将client发的请求转发到具体后端服务器。
gate基础功能:
- 与client建立连接
与client建立连接是gate最基本的功能,一个服务作为gate,所有client发送过来的消息都必须先到达这里。client与gate可能是长连接,如socket。也可以是短连接如http。 - 消息过滤
client可能给server发送任何消息,合法的非法的都有可能。gate对业务服务进行隔离,消息到gate这里,gate会对消息进行解密解包,对消息的合法性进行统一验证,过滤出非法的请求,减少业务服务不必要处理的请求,减轻业务服务的压力。 - 消息转发 负载均衡
gate接收到消息后,根据消息的路由规则将消息分发到不同的业务服务去处理,控制每个也业务处理的流量大小,也可部署多个网关,分散太多client的压力。 - 业务服务的动态扩容
gate是业务服务消息的转发中心,当一个服务的消息量过大时,可添加一台新的服务器来处理这些消息。而新的服务只需要注册到网关即可。相反,消息量减少时可动态停止一个服务撤销注册即可。 - 保证玩家在线 切换服务器无需重新建立连接
如果游戏服务器框架采用分线等方式的话,在玩家跳转到场景或逻辑服务器时,不需要断开与gate的连接,玩家数量在不同游戏服之间的切换是内网切换,切换工作瞬间完成,玩家几乎察觉不到,这保证了游戏的流畅性和良好的用户体验。 - 保持心跳
gate可以定时通过发送心跳包给正在连接的client,保证client与gate的连接,如果某个client掉线了,gate就通知各个服务器去做玩家的下线处理逻辑。这样避免了逻辑服等出现多个相同角色的bug。从一定程度上,减轻了逻辑服务器的压力。
gate功能特性:
- 对外开放:client需要直到gate的IP和端口才能连接上来
- 统一入口:架构中可能会存在很多后端服务,若没有统一入口,client需知道每个后端服务的IP和端口。
- 请求转发:统一入口后,gate必须能将client的请求转发到准确的服务上。
- 无感更新:client连接的是gate,只要连接不断开,更新后端服务器对client来说是无感知的。
gate特殊功能:
- Session认证
gate能维护client是否登录成功的状态,对于未登录的请求不予转发,从而预防恶意攻击。 - 流量限流
DDOS攻击client可以通过for循环一直发请求,必须进行限制。 - 踢下线
游戏维护时,为了让玩家能更新补丁会将玩家踢下线,重新走一遍登录流程,避免client与server的数据不一致造成显示上的bug。客服也需要对违规玩家进行踢下线处理。 - 在线统计
gate拥有所有玩家的连接信息,可轻松统计当前玩家在线。 - 协议加密
为了避免client恶意攻击需对请求加密,由于统一了入口,网关做起来比较容易。 - 心跳检测
心跳检测用于检测client是否已经掉线,若长时间没有收到心跳请求,则认为client已经掉线,直接请求登录让玩家重新走登录流程。
gate需要与client保证连接,client连接到gate验证之后,需要将连接的channel和用户uid绑定,这样方便用户uid查询它的客户端连接,这样就可以给client返回消息。因为需要管理所有client连接,所以会涉及到多线程的操作。在每个连接验证成功之后,会在当前连接的channel中添加用户uid和channel的映射到一个hashmap中。
典型的gate服务架构
- 后端服务路由表:维护后端当前有哪些服务注册到了网关,以及服务对应哪些区服的配置信息。
- 区分注册表:维护当前开了哪些区服以及区服信息
- 终端管理:所有连接上网的设备或进程都被认为是一个终端,终端会有一个编号,这个编号对应后端服务编号或玩家编号。当需要转发消息给后端服务或客户端时,需从终端管理中找到具体的连接进行消息发送。
- step1.客户端连接网关服务器,然后发送登录请求给网关。
- step2.网关将登录请求转发给对应区服的后端服务器进行登录验证。
- step3.后端服务器验证成功后返回登录信息给网关
- step4.网关会根据登录维持一个Session映射,用于安全验证和重登判断,然后转发登录信息给客户端。
- step5.客户端收到登录成功消息后,就可以发送业务请求给网关。
- step6.网关收到业务请求后先会判断玩家是否已经登录锅,登录过的才转发给后端服务器,并且在协议头增加玩家标记。
- step7.后端服务器收到业务请求后根据协议头的玩家标记,找到玩家的数据进行业务处理,然后返回给网关。
- step8.网关收到业务回复后直接返回给客户端。