Go游戏服务器开发的一些思考(二):综合考察(上)

来源:互联网 发布:一建试题软件 编辑:程序博客网 时间:2024/05/17 00:02

对Go做体检

Go语言在游戏服务器方向的开发,起步比较晚。有必要考察下使用Go来实现,该怎么去做,会遇到什么问题,以及怎么克服。这里把使用Go语言开发MMO RPG游戏作为考察对象,对Go做一次体检。

MMO RPG最小功能清单

首先,罗列下开发一个MMO RPG必须具备的功能。目标是实现这些功能后,玩家能登录游戏,在地图上跑动,能相互看到对方。若能很好的实现这些功能,各项运行指标达标。那么,我们就可以罗列更多的功能清单,来丰富它。按照这样的方式,经过多次迭代后,最终达到一个完整MMO RPG的水平。

以下是个人认为MMO RPG游戏服务端 必备功能。

主要功能:

  • 如何与Unity3D交互
  • 网络层
  • 定时器、事件投递
  • 多任务系统
  • 数据持久化方案
  • 配置文件及热配置
  • 引擎与应用逻辑框架
  • 服务发现机制
  • 服务器架构实现
  • 帐号与角色
  • 登录流程(包括登出、重登陆)
  • 世界场景搭建
  • 移动、寻路及同步
  • AOI算法实现

辅助功能:

  • 自动构建
  • 单元测试
  • 部署及监视
  • 调试演示

加粗的条目都有“大体相同、又有细微差异”的功能,因此在使用Go语言开发时,需要合理的使用 Go接口机制 + 反射机制,实现能按默认逻辑,又可制定某些差异的方式运行。

下面将依次考察这些条目。

如何与Unity3D交互

  • protobuf

    这里是golang官方git上提供的go protobuf项目地址:

    https://github.com/golang/protobuf.git

    Unity3D项目支持protobuf与服务端通信,在业界比较流行。那么这项功能没有是什么大问题。

  • gRPC

    go 同时是支持 gRPC 的,设置官方git上的网址:

    https://github.com/grpc/grpc-go.git

    gRPC默认网络协议是protobuf。目前不清楚Unity3D是否支持gRPC。如果打算使用gRPC的话,Unity3D 可能需要实现 gRPC 相关规范,来达成与服务端的正常通信。

  • 基于 protobuf 或者 gRPC 的 远程对象同步

    这里的对象同步概念 来至于 KBEngine实体中的部分功能。

    protobuf、gRPC 通过提供工具来生成2端代码文件的方式隐藏解析网络数据流的细节。

    同理 我们可以通过制作工具,生存2端代码文件。提供给用户的是结构体、接口。而隐藏下面的RPC通信、服务端数据变化消息推送。

    这如同 c 与 c++ 的区别,protobuf、gRPC并没有提供 将 某些相关连的数据流 联系到一起的机制。而 远程对象同步,则给用户的是面向对象的编程思维。

    在熟练玩转Go语言后,是可以考虑实现该功能的。同时,这部分功能也需要Unity3D的人员配合。因为需要的是生成2端的代码文件。

网络层

  • Go语言select关键字 + Go语言go关键字 + Go的net包

    看过Go入门教材的同学,应该能马上想的这样方式来实现。
    这种方式比较考验个人能力。好坏参差不齐。

  • 参考 github 开源库

    粗略搜索了几个star数比较多的github项目可以参考:

    https://github.com/davyxu/cellnet.git
    https://github.com/funny/link.git

    因此,最差的情况,直接使用star数比较多的开源库

  • 参考成熟项目中的网络模块

    这是比较保险的方式,对于有一定项目积累的公司,这是最好的方式。

  • 网络模块与应用逻辑框架的整合

    游戏服务端一般会采用 串行的逻辑层 + 并发的IO层 的方式。这部分与 应用逻辑框架搭建 相关。这里不在深入

定时器、事件投递

  • go time包

    go语言自带了该功能。应该没有问题。

  • 定时器与应用逻辑框架的整合

  • 事件投递,基于多任务系统,即可实现事件投递

多任务系统

  • 并发操作必须是引擎可控的

    提供并发操作的统一接口

  • Actor模式

    并发系统,以Actor模式独占鳌头。搜索了下github,使用该库应该足以应对:

    https://github.com/AsynkronIT/protoactor-go.git

    protoactor-go开源项目是需要重点调查下,因为看了官方用例,它提供了网络数据收发功能。因此很有可能该库可以派上用场,且可以解决很多问题。

  • 多任务系统与应用逻辑框架的整合

数据持久化方案

  • 使用redis做内存数据库

    官方推荐的redis github地址:

    https://github.com/go-redis/redis.git

  • 使用mysql做数据持久化

    官方推荐的mysql github地址:

    https://github.com/go-sql-driver/mysql.git

    这里有问题需要做进一步的考察:如何方便的让mysql支持海量数据存取
    如 redis 能做成集群来进行横向扩展。那么mysql是否也可以。否则只能放弃使用mysql。如让redis全全负责对数据做持久化处理。

  • redis 、mysql 与应用逻辑框架的整合

  • redis 、mysql ORM工具

    这里的对象同步概念 来至于 KBEngine实体中的部分功能。

    使用面向对象的方式操作数据。而不是redis命令、sql语句。同时可以隐藏背后的保存数据的策略。

    在熟练玩转Go语言后,是可以考虑实现该功能的。

配置文件及热配置

  • cvs

    go 自带包encoding/csv,支持

  • json

    go 自带包encoding/json,支持

  • xml

    go 自带包encoding/xml,支持

  • 配置文件改变重加载

本章暂时写到这里,网络文章 篇幅太长不便于阅读。(后续)

阅读全文
1 0
原创粉丝点击