GoWorld代码:https://github.com/xiaonanln/goworldgit
Golang具备运行效率高、内存安全等优良特性,所以是很是适合用来进行服务器开发。使用Golang开发游戏服务器有以下的优势:github
然而使用Golang编写游戏服务器也面临必定的困难,主要是两个方面:golang
GoWorld是一个使用Golang实现的可扩展的分布式游戏服务器引擎,并致力于解决以上的这些问题。首先,GoWorld提供对象(Entity)框架来为服务端逻辑开发提供便利。Entity能够在多个场景(Space)之间进行跳转,而且提供AOI支持,所以GoWorld能够很好的支持各类MMORPG游戏服务器所须要的功能。另一方面,GoWorld经过进程替换来实现游戏逻辑的热更新。在热更新过程当中,玩家的客户端链接和各类游戏状态会被保持,并在热更新结束以后恢复正常游戏。redis
GoWorld架构图shell
一个GoWorld系统包括一个dispatcher进程、一个或者多个game进程以及一个或者多个gate进程。dispatcher负责game之间以及gate和game之间的消息转发,并对一些基础功能提供支持。Game进程负责Entity对象的管理和全部游戏逻辑的运行,Gate进程负责管理客户端链接,并将客户端请求经过dispatcher转发到game进程。Gate还须要负责对客户端数据进行压缩和加解密(还没有实现)。GoWorld能够经过增长更多的game进程或者gate进程来增长服务器的负载能力。虽然dispatcher进程是GoWorld服务器中的单点,可是初步的测试和推算代表一个多核高性能的主机上运行dispatcher能够支持100万以上的同时在线。数据库
GoWorld使用Hot-Swappaing的方式实现游戏逻辑的热更新。在Game进程收到SIGUSR1信号的时候,就会把当前全部Entity以及其余相关状态保存到一个文件中,并结束进程。此时可使用最新的可执行镜像重启game进程,并从保存的文件中恢复全部的Entity和游戏状态,并恢复执行。在热更新的过程当中,玩家客户端的链接不会中断,玩家角色的状态也会保持不变,只是会感觉到一点卡顿,并在热更新结束后恢复。apache
在GoWorld中,咱们使用一个Entity来表明游戏场景中的玩家、怪物、NPC之类的对象。GoWorld还支持从客户端到服务端的RPC通讯,以及服务端Entity之间的RPC通讯。安全
GoWorld在RPC数据的封包和解析上使用了MessagePack格式,并会在未来支持Google Protobuf。服务器
场景(Space)是GoWorld中一个很是重要的概念。每一个Entity都属于一个场景。同一个场景的Entity之间能够直接调用相互的函数,而跨场景的Entity之间须要使用RPC来进行通讯。Entity能够经过迁移(Migrate)函数来跳转到别的场景中,跳转场景后Entity的全部属性数据都将保持不变。架构
GoWorld提供了一套简化的AOI机制。同场景的Entity之间会根据距离维护一个邻居列表。GoWorld使用十字列表维护场景里的全部Entity,从而根据Entity的位置变化实时更新全部Entity的AOI信息。
GoWorld为Entity提供了属性机制。属性分为服务端属性、客户端属性和全局属性。服务端属性只有在服务端能够访问,客户端属性能够在客户端和服务端同时访问。每次服务端对其进行修改的时候,属性的变化会马上被同步到客户端,从而保持客户端数据的实时更新。全局属性是对全部Entity均可见的数据,包括其余玩家。全局属性在发生变化的时候会被广播到AOI范围内的全部玩家,从而使得玩家能够实时获取AOI范围内其余Entity的属性变化。
GoWorld支持Entity的自动存盘。持久化(persistent)的Entity会按必定的时间间隔进行存盘。GoWorld还提供了对已存盘Entity的载入功能。目前GoWorld支持MongoDB和Redis两种不一样的底层数据库。
每一个server都会建立一个监听端口用于接收来自客户端的链接。客户端和服务端之间也采用一个RPC的通讯方式。客户端能够对玩家和玩家AOI里的其余Entity发起RPC调用。
GoWorld支持对客户端通讯进行压缩。加密功能还有待添加。。。
GoWorld游戏服务器引擎的开发目标是可以很好地支持常见的MMORPG类游戏。在这类游戏里,玩家每每控制一个角色,并能够在不一样的场景之间进行切换,而且经过和周围的其余对象(包括NPC、怪物、其余玩家等)进行交互进行游戏内容。GoWorld所提供的场景-对象机制可以很好地支持这些功能。对于其余相似卡牌、棋牌类游戏,也可使用GoWorld提供的对象机制进行逻辑开发。
请前往github下载GoWorld:https://github.com/xiaonanln/goworld/
或者使用go get工具:
go get github.com/xiaonanln/goworld
下载GoWorld依赖的库
go get -u github.com/xiaonanln/go-xnsyncutil/xnsyncutilgo get -u github.com/xiaonanln/goTimergo get -u github.com/xiaonanln/typeconvgo get -u golang.org/x/net/contextgo get -u github.com/Sirupsen/logrusgo get -u github.com/garyburd/redigo/redisgo get -u github.com/google/btreego get -u github.com/pkg/errorsgo get -u gopkg.in/eapache/queue.v1go get -u gopkg.in/ini.v1go get -u gopkg.in/mgo.v2go get -u gopkg.in/vmihailenco/msgpack.v2go get -u gopkg.in/natefinch/lumberjack.v2
1. 启动MongoDB或者Redis做为数据库
2. 拷贝goworld.ini.sample为goworld.ini,并进行配置
编译并运行中心分发器(dispatcher)
make dispatcher
components/dispatcher/dispatcher
4. 编译并运行网关服务器(gate)
make gate
components/gate/gate -gid 1
5. 编译并运行测试逻辑服务器(test_game)
make test_game
examples/test_game/test_game -gid 1
make test_clientexamples/test_client/test_client -N 500
还在开发阶段,更多内容有待补充,敬请关注 ……
QQ讨论群:662182346