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,支持
配置文件改变重加载
本章暂时写到这里,网络文章 篇幅太长不便于阅读。(后续)
- Go游戏服务器开发的一些思考(二):综合考察(上)
- Go游戏服务器开发的一些思考(三):综合考察(中)
- Go游戏服务器开发的一些思考(四):综合考察(下)
- Go游戏服务器开发的一些思考(二十一):Go语言的两处脑残设定
- Go游戏服务器开发的一些思考(二十三):Go语言Log库封装技巧
- Go游戏服务器开发的一些思考(二十六):Go Redis ORM库
- Go游戏服务器开发的一些思考(十四):IO游戏同步(二)
- Go游戏服务器开发的一些思考(七):Redis
- Go游戏服务器开发的一些思考(二十五):Redis的Docker Swarm部署
- Go游戏服务器开发的一些思考(二十):Docker Swarm部署Etcd示例
- Go游戏服务器开发的一些思考(二十二):Godep包管理介绍
- Go游戏服务器开发的一些思考(二十四):命令行库封装技巧
- Go游戏服务器开发的一些思考(十六):IO游戏服务器架构
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
- Go游戏服务器开发的一些思考(十七):IO游戏同步(三)
- Go游戏服务器开发的一些思考(十一):IO游戏同步
- Go游戏服务器开发的一些思考(十三):behavior3go的一些坑(备忘)
- Go游戏服务器开发的一些思考(十九):服务器架构之服务发现
- 《JavaScript DOM编程艺术》第十章 用javascript实现动画效果
- 线段树区间更新 Just a Hook
- 【脚本语言系列】关于Python持久化dbhash,你需要知道的事
- ssh登录
- 正则使用注意事项
- Go游戏服务器开发的一些思考(二):综合考察(上)
- PHP PDO::execute()执行insert into失败返回错误无错误消息的解决
- String、StringBuffer与StringBuilder之间区别
- CRC32
- IE11的一些小问题
- 使用cout输出16进制,8进制,2进制
- NMAP执行脚本smb-check-vulns.nse出错
- 只要会说“范围、时间、成本、质量”,鹦鹉都能成为项目经理
- Linux入门基础