游戏服务器框架之网关

当用户在大厅登陆成功之后,大厅会分配一个网关的地址给客户端。客户端与这个网关建立长连接,负责与服务器的通信。网关的主要功能有:

  • 消息解析
  • 消息合法性验证
  • 转发消息到业务服务
  • 流量限制
  • 版本验证等。

一般的功能都可以随便添加。这里主要说一下消息转发。对于客户端和业务服务来说,网关是一个承上启下的作用。首先客户端与网关建立连接,第二,网关收到客户端的一请求请,得知道把这条请求发送到哪个业务服务上面,第三,业务服务处理完一个请求,如何把消息返回给网关,网关再如何把消息发给客户端。

一,客户端与网关建立连接

  网关作为一个单独的对外服务,而且是长连接,一般使用Netty作为服务的网络通信框架。它的异步高性能是公认的,这没什么可说的。在游戏服务器的网关中,建立连接一般分为两个步骤:

  1,客户端通过socket连接到服务器

  2,连接的认证

  连接到服务器之后,客户端和服务器就会建立起一个socket通信通道,但是一个服务器的socket连接数量是有限的,如果客户端与服务器大量建立socket连接,而不通信,就会造成大量的socket资源被占用,增加服务器的压力,影响正常用户的使用,所以要有连接的认证,当连接建立成功之后,要在一段时间之内进行认证,如何认证呢?就是让用户请求token验证,如果一段时间内没有认证,则服务器主动断开连接。这样也可以保证之后用户的通信是有效的,不用每次都验证token.用户验证成功之后,保证用户id与连接的映射,方便根据用户id给此用户的客户端返回消息。

二,网关与业务服务间的通信

  一个网关后面可能有n个业务服务,所以是一个一对多的关系。所以增加一个业务服务都需要与网关建立一条连接。如果直接建立连接,管理起来比较麻烦。既然是一对多的关系,我们自然想到一种模式:发布-订阅。这种模式可以解耦发布者和订阅者。而目前很多消息队列框架都支持这种模式。比如rabbitmq,rocketmq,kafka等。推荐使用rocketmq。这里阿里的消息中间件。

  

  要实现网关和业务服务的数据交互,大消息传输中需要几个公共参数:

    fromServerId     消息的发送服务器id,即消息的来源服务id

    toServerId    消息要到害的服务Id

  在网关与业务服务交互的消息中必须带有这两个参数

  1,网关收到的消息如何转发到业务服务器

    既然是使用发布-订阅模式,那网关就是发布者,业务服务就是订阅者,即消息消费者。在网关处,首先是根据用户id选择用户到过的业务服务id,可以根据用户id和业务服务数量求余,这样同一个用户id都会被分配到同一台业务服务器上面。为了可以保证动态添加新的服务,每次给用户分配好到达的业务服务id之后,可以缓存起来,有缓存的话就使用缓存中的,这样动态添加一台新的业务服务之后,已分配的用户不用重新分配,当网关重启之后清空缓存,再重新分配。获得的业务服务id即toServerId,网关收到消息之后,发送消息的topic可以使用toServerId组合,例如:“GameGate” + toServerId ,这样同一个业务服务的消息都会发送到同一个消息主题里面。而在业务服务端,则需要监听网关的消息,监听topic就是“GameGate” + 本业务服务的id,这样就可以收到网关发送过来的消息了。

  2,业务服务如何返回消息给网关

    同样的道理,业务服务要发消息给网关,那么业务服务就是发送者,发送的消息topic可以是“GameServer” + 网关服务的id,即从接收消息中获取的fromServerId。而网关那边则需要监听topic:"GameServer" + 本网关的服务Id.

 

  这样就完成了网关和业务服务之间的消息交互。网关的其它职能可以根据需要增加。



   

QQ群交流:66728073,更多文章:http://www.coc88.com;公众号:

  

原文地址:https://www.cnblogs.com/wgslucky/p/9093149.html

时间: 2024-11-13 17:07:19

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

游戏服务器框架:Leaf/go

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

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

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

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

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

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

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

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

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

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

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

游戏服务器框架分析

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

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,某人依然在仰望星空.期间很多梦碎了,很多还在坚持着,生活过得波澜不惊.而我也从刚毕业是的青涩逐步蜕变为"老油条".不知道是一种悲哀.还是一种悲哀.还是一种悲哀....... 庆幸的是梦还在继续,一颗倔强的心还在坚持.希望明天的明天被束缚的心能回到梦开始的地方! ==========