GoWorld是一个使用Golang实现的可扩展的分布式游戏服务器引擎,并支持游戏逻辑的热更新。git
GoWorld代码:https://github.com/xiaonanln/goworldgithub
进程结构
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通讯。app
GoWorld在RPC数据的封包和解析上使用了MessagePack格式,并会在未来支持Google Protobuf。分布式
场景
场景(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支持对客户端通讯进行压缩。加密功能还有待添加。。。