go实现一个简单的游戏服务器框架(lotou)编码

代码仓库

在lotou中实现了两种二进制编码方式。

binary

一种是普通的C/C++模式的小端编码方式,每一个数据都被依次编码进一个二进制流中,基本用法如下:

  • 编码
    binary.Encode(v)
    binary.Encode(v)
  • 解码
    binary.Decode(&v)
    binary.Decode(&v)

使用非常简单,编码方式也很简单。

还有一种是为了用于lotou内部通信(后面即将实现的多节点实现中会用到)

gob

在这种方式中,编码的时候会将数据的类型也编码进二进制流中,这样可以让解码端直接根据二进制流中的类型生成对应的数据,而不是需要根据传入的参数来判断数据需要如何解析。
之所以需要这样做,是因为在服务和服务之间发送数据的时候,发送的实际上是一个[]interface{}的类型,slice的元素的实际类型是未知的,所以必须使编码是类型自描述的。目前该编码方式可以支持除复数外的所有的内置数据类型,以及提前注册进编码中的结构体(所有注册的结构体必须在每一个节点都以相同的顺序注册,因为现在的类型是使用的ID表示,如果注册顺序不一致,会导致解析类型不匹配)。
使用方法也很简单

  • 编码
    gob.Encode(v1)
    gob.Encode(v2)
  • 解码
    v, e := gob.Decode()
    v, e := gob.Decode()

要注意decode返回的是一个interface,实际类型在分发到对应服务的时候,由dispatchM函数通过reflect.Value的Call方法自动进行转换。

reflect.Value.Call
func (v Value) Call(in []Value) []Value
这函数中v是一个函数的reflect.Value,in是函数的参数,并且函数的返回值也放在一个Value的slice里面返回。in的每一个元素对应v的一个参数,并且他们必须一一是可赋值的。即in[i]的实际类型是必须是可以赋值给函数的第i个参数的
如果函数的输入有可变参数,那么Call会自动生成可变参数的slice。如果v不是一个func,那么Call函数会panic。

mqantmqant 是一款基于 Golang 语言的简洁,高效,高性能的分布式游戏服务器框架,研发的初衷是要实现一款能支持高并发,高性能,高实时性的游戏服务器框架,也希望 mqant 未来能够做即时通讯和物联网方面的应用。特性分模块机制基于 golang 协程,开发过程全程做到无 callback 回调,代码可读性更高RPC 支持本地和远程自动切换远程 RPC 默认使用 rabbitmq,未来可以添加更多种类的通信协议网关采用 MQTT 协议,无需再开发客户端底层库,直接套用已有的 MQTT 客户端代码库,可以支持IOS,Android,websocket,PC 等多平台通信现如今只有多进程的架构才能达到支撑较多在线用户,降低服务器压力,降低单点故障所带来的影响等要求,因此一个真正高可扩展的游戏运行架构必须是多进程的。然而在游戏的开发和运营也是按步骤阶段性进行的,尤其是现如今服务器硬件设备配置也越来越高的前提下,在游戏刚开始运营时单台服务器就足够支撑了,况且多进程部署所带来的运维成本也相对较高。mqant 的设计思想是在能用单台服务器时能让充分挖掘服务器的性能,而在需要多进程时再通过简单的配置就可以实现分布式部署。mqant 游戏服务器的运行架构mqant 服务器是按模块来划分功能模块的,例如 用户管理,在线聊天,战斗平台等等都应该划分为独立的模块模块之间通过 RPC 通讯,mqant 底层会根据实际情况选择 rpc 数据交互的通信渠道,在调用模块在同一个进程的情况下直接使用 golang chan 通讯,因此同进程内模块通信性能不受影响。 标签:mqant
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值