GoWorld – 用Golang写一个分布式可扩展、可热更的玩耍服务器

GoWorld代码:https://github.com/xiaonanln/goworld

Golang有运行功用高、内存安全等出色特性,因而是非凡适合用来展开服务器出。使用Golang开发娱乐服务器出如下的优点:

  • 运作成效远超出各样脚本语言,大幅度提高服务器承载能力
  • 内存安全,不会合像C++服务器这样出现内存错误导致服务器down机
  • Goroutine可以很好地动基本上按总括能力,提高承载能力
  • Golang本身相当简单好用,我们还欣赏

而以Golang编写游戏服务器也面临一定之忙碌,重假设简单个方面:

  • Golang是静态编译语言,难以为提供方便的语法糖从而简化开发工作
  • Golang无法扶助语言层面的热更新,可能因反复关服带来玩家流失

GoWorld是一个运Golang实现之而增加的分布式游戏服务器引擎,并从事为解决上述之这一个题目。首先,GoWorld提供靶(Entity)框架来啊服务端逻辑开发提供便民。Entity可以当多独情景(Space)之间开展跳转,并且提供AOI帮助,因而GoWorld可以分外好的援助各类MMORPG游戏服务器所要之功力。另外一边,GoWorld通过进程替换到落实休闲游逻辑的热更新。在热更新过程中,玩家的客户端连接和各样娱乐状态会让保,并当热更新截至之后恢复生机正常游戏。

经过社团

图片 1

GoWorld架构图

一个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和游玩状态,并回复执行。在热更新的过程中,玩家客户端的连天不碰面停顿,玩家角色的状态吧会维持无移,只是会感受及均等触及卡顿,并以热更新截至晚復苏。

Entity架构

Entity RPC

以GoWorld中,大家应用一个Entity来表示游戏场景中之玩家、怪物、NPC之类的对象。GoWorld还补助于客户端到劳动端的RPC通信,以及服务端Entity之间的RPC通信。

GoWorld在RPC数据的封包和剖析及应用了MessagePack格式,并会见当前几日支撑GoogleProtobuf。

场景

此情此景(Space)是GoWorld中一个怪紧要之概念。每个Entity都属一个气象。同一个气象的Entity之间可一向调用相互的函数,而超越场景的Entity之间需要利用RPC来举行通信。Entity可以通过搬迁(Migrate)函数来过反到其余场景中,跳反场景后Entity的富有属性数据皆以维持不移。

AOI

GoWorld提供了平模拟简化的AOI机制。同场景的Entity之间会冲距离珍重一个街坊列表。GoWorld使用十字列表维护场景里之所有Entity,从而依据Entity的地方变动实时更新所有Entity的AOI消息。

性能同步

GoWorld为Entity提供了性能机制。属性分为服务端属性、客户端属性和大局属性。服务端属性唯有当服务端可以拜,客户端属性可以以客户端以及服务端同时做客。每便服务端对这些举办改动的时段,属性之变化会立即让一道到客户端,从而保障客户端数据的实时更新。全局属性是针对性所有Entity都可见的多少,包括其它玩家。全局属性在暴发变化的当儿会给广播及AOI范围外之享有玩家,从而使得玩家可以实时获取AOI范围外任何Entity的属性变化。

Entity自动存盘

GoWorld协理Entity的自动存盘。持久化(persistent)的Entity会按自然的时光间隔举行存盘。GoWorld还提供了针对曾存盘Entity的载入效率。近来GoWorld援助MongoDB和Redis两栽不同的底数据库。

客户端连接和通信

每个server都相会创一个监听端口用于收纳来自客户端的接连。客户端和服务端之间吧下一个RPC的通信形式。客户端好本着玩家与玩家AOI里之别Entity发起RPC调用。

GoWorld帮忙针对客户端通信举办削减。加密功效还有待添加。。。

适用场地

GoWorld游戏服务器引擎的出目标是力所能及生好地支撑广大的MMORPG类游戏。在当时类娱乐里,玩家频繁控制一个角色,并可当不同之气象中举行切换,并且通过与周围的其他对象(包括NPC、怪物、其他玩家当)举行互举办娱乐内容。GoWorld所提供的场景-对象机制能很好地帮忙这么些效应。对于其他类卡牌、棋牌类游戏,也得下GoWorld提供的目的机制举办逻辑开发。

 

设置与运行

下载GoWorld游戏服务器

请前往github下载GoWorld:https://github.com/xiaonanln/goworld/

要么应用go get工具:

go get github.com/xiaonanln/goworld

下载GoWorld依赖之库

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> github class=”crayon-sy”>.com class=”crayon-o”>/xiaonanln class=”crayon-o”>/go class=”crayon-o”>-xnsyncutil class=”crayon-o”>/ class=”crayon-e”>xnsyncutil

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> github class=”crayon-sy”>.com class=”crayon-o”>/xiaonanln class=”crayon-o”>/ class=”crayon-e”>goTimer

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> github class=”crayon-sy”>.com class=”crayon-o”>/xiaonanln class=”crayon-o”>/ class=”crayon-e”>typeconv

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> golang class=”crayon-sy”>.org class=”crayon-o”>/x class=”crayon-o”>/net class=”crayon-o”>/ class=”crayon-e”>context

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> github class=”crayon-sy”>.com class=”crayon-o”>/Sirupsen class=”crayon-o”>/ class=”crayon-e”>logrus

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> github class=”crayon-sy”>.com class=”crayon-o”>/garyburd class=”crayon-o”>/redigo class=”crayon-o”>/ class=”crayon-e”>redis

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> github class=”crayon-sy”>.com class=”crayon-o”>/google class=”crayon-o”>/ class=”crayon-e”>btree

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> github class=”crayon-sy”>.com class=”crayon-o”>/pkg class=”crayon-o”>/ class=”crayon-e”>errors

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> gopkg class=”crayon-sy”>.in class=”crayon-o”>/eapache class=”crayon-o”>/queue class=”crayon-sy”>. class=”crayon-e”>v1

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> gopkg class=”crayon-sy”>.in class=”crayon-o”>/ini class=”crayon-sy”>. class=”crayon-e”>v1

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> gopkg class=”crayon-sy”>.in class=”crayon-o”>/mgo class=”crayon-sy”>. class=”crayon-e”>v2

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> gopkg class=”crayon-sy”>.in class=”crayon-o”>/vmihailenco class=”crayon-o”>/msgpack class=”crayon-sy”>. class=”crayon-e”>v2

go  class=”crayon-v”>get  class=”crayon-o”>-u class=”crayon-h”> gopkg class=”crayon-sy”>.in class=”crayon-o”>/natefinch class=”crayon-o”>/lumberjack class=”crayon-sy”>. class=”crayon-v”>v2

运行GoWorld测试服务端和客户端

  1. 起步MongoDB或者Redis作为数据库

  2. 拷贝goworld.ini.sample为goworld.ini,并展开安排

编译并运行中央分发器(dispatcher)

make class=”crayon-e”>dispatcher

components/ class=”crayon-v”>dispatcher/ class=”crayon-v”>dispatcher

**

4. 编译并运行网关服务器(gate)

*make gate*

***components/gate/gate -gid
1***

5.
编译并运行测试逻辑服务器(test_game)

**make test_game**

examples/test_game/test_game -gid 1

6.
编译并运行测试游戏客户端(test_client)

make test_client 

examples/ class=”crayon-v”>test_client/ class=”crayon-v”>test_client class=”crayon-o”>-N
class=”crayon-cn”>500

 

 


还在开发阶段,更多内容有待补充,敬请关注 ……

QQ讨论群:662182346