1. 程式人生 > >GoWorld – 用Golang寫一個分散式可擴充套件、可熱更的遊戲伺服器

GoWorld – 用Golang寫一個分散式可擴充套件、可熱更的遊戲伺服器

Golang具有執行效率高、記憶體安全等優良特性,因此是非常適合用來進行伺服器開發。使用Golang開發遊戲伺服器有如下的優點:

  • 執行效率遠高於各種指令碼語言,大幅度提升伺服器承載能力
  • 記憶體安全,不會像C++伺服器那樣出現記憶體錯誤導致伺服器down機
  • Goroutine能夠很好地利用多核計算能力,提升承載能力
  • Golang本身非常簡單好用,大家都喜歡

然而使用Golang編寫遊戲伺服器也面臨一定的困難,主要是兩個方面:

  • Golang是靜態編譯語言,難以為提供方便的語法糖從而簡化開發工作
  • Golang無法支援語言層面的熱更新,可能因為頻繁關服帶來玩家流失

GoWorld是一個使用Golang實現的可擴充套件的分散式遊戲伺服器引擎,並致力於解決以上的這些問題。首先,GoWorld提供物件(Entity)框架來為服務端邏輯開發提供便利。Entity可以在多個場景(Space)之間進行跳轉,並且提供AOI支援,因此GoWorld可以很好的支援各種MMORPG遊戲伺服器所需要的功能。另外一方面,GoWorld通過程序替換來實現遊戲邏輯的熱更新。在熱更新過程中,玩家的客戶端連線和各種遊戲狀態會被保持,並在熱更新結束之後恢復正常遊戲。

程序結構

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格式,並會在將來支援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支援對客戶端通訊進行壓縮。加密功能還有待新增。。。

適用場合

GoWorld遊戲伺服器引擎的開發目標是能夠很好地支援常見的MMORPG類遊戲。在這類遊戲裡,玩家往往控制一個角色,並可以在不同的場景之間進行切換,並且通過和周圍的其他物件(包括NPC、怪物、其他玩家等)進行互動進行遊戲內容。GoWorld所提供的場景-物件機制能夠很好地支援這些功能。對於其他類似卡牌、棋牌類遊戲,也可以使用GoWorld提供的物件機制進行邏輯開發。

安裝和執行

下載GoWorld遊戲伺服器

或者使用go get工具:

go get github.com/xiaonanln/goworld

下載GoWorld依賴的庫

go get -u github.com/xiaonanln/go-xnsyncutil/xnsyncutil go get -u github.com/xiaonanln/goTimer go get -u github.com/xiaonanln/typeconv go get -u golang.org/x/net/context go get -u github.com/Sirupsen/logrus go get -u github.com/garyburd/redigo/redis go get -u github.com/google/btree go get -u github.com/pkg/errors go get -u gopkg.in/eapache/queue.v1 go get -u gopkg.in/ini.v1 go get -u gopkg.in/mgo.v2 go get -u gopkg.in/vmihailenco/msgpack.v2 go get -u gopkg.in/natefinch/lumberjack.v2

執行GoWorld測試服務端和客戶端

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

6. 編譯並執行測試遊戲客戶端(test_client)
make test_client  examples/test_client/test_client -N 500

還在開發階段,更多內容有待補充,敬請關注 ……

相關推薦

GoWorldGolang一個分散式擴充套件遊戲伺服器

Golang具有執行效率高、記憶體安全等優良特性,因此是非常適合用來進行伺服器開發。使用Golang開發遊戲伺服器有如下的優點: 執行效率遠高於各種指令碼語言,大幅度提升伺服器承載能力 記憶體安全,不會像C++伺服器那樣出現記憶體錯誤導致伺服器down機 Goroutine能夠很好地利用多核計算

Docker網路體系結構:設計擴充套件移植的Docker容器網路

原文地址譯者:本人翻譯水平有限,目的僅是為了學好Docker,如有錯誤請見諒。翻譯版本:v1.01(將不斷優化翻譯質量)本文包含以下內容Docker容器就是將應用及其所依賴執行環境的完整檔案系統打成一個包:包括所需程式碼,執行庫,系統工具,系統庫等。如此來保證應用和應用的執行

NAN一個nodejs的c++擴充套件

NAN介紹 NAN的全稱為Native Abstraction for Node.js, 其表現上是一個Node.js包。安裝後,就得到一堆C++標頭檔案,裡面是一堆巨集。它主要為Node.js和V8跨版本提供了封裝的巨集,使得開發者不用關心各個版本之間的API的差異。(from 《nodejs來一打

rabbitmq 一個多機分散式爬蟲

                     其實說是爬蟲也只是個幌子。換成其他的耗資源的程式也成,耗CPU,耗網路。                                              1,要有被用於爬取的url,用一個client生成url,在ser

Python一個批量生成賬號的函數(戶控制數據長度數據條數)

shuf open 小寫 長度 數據 ase 函數 用戶控制 app # 1、寫一個函數,批量生成一些註冊使用的賬號:[email protected]/* */,長度由用戶輸入,產生多少條也由用戶輸入,用戶名不能重復,用戶名必須由大寫字母、小寫字母、數字組成

集合一個簡單的隨機分組,以及集合內元素數量查詢

移除 以及 表示 元素 move spa color 查詢 println 12個人,隨機分為4組 public static void main(String[] args) { List list = new ArrayList();

node一個皖水公寓自動刷房源腳本

port 發件人 ges 開啟 pan sendemail transport tar 收件人 因為住的地方離公司太遠,每天上下班都要坐很久的班車,所以最近想搬到公司旁邊的皖水公寓住。去問了一下公寓的客服,客服說房源現在沒有了,只能等到別人退房,才能在網站上申請到。 如果

Python一個遊戲

python 小腳本 剛學Python時間不長,但也知道了一點,看別人的參考寫了一個猜數字小遊戲,也算是禹學於樂吧。#!/usr/bin/env python #coding=utf-8

hive一個獲取本日期的季度初的sql

ble 等於 diff 需要 lock 2-0 lec select ediff 由於項目需要獲取(本季度的的發生額總和)/(本季度經歷的天數)的數據(還有月均,年均的數據)。 判斷季度的時候是一個難點,開始的時候寫了一堆case when 來判斷月份,後來寫著寫著發現,這

五:JAVA一個阿裏雲VPC Open API調程序

外部jar包 ef7 dac java 方式 命令 pro ng- 自動化管理 用JAVA寫一個阿裏雲VPC Open API調用程序 摘要:用JAVA拼出來Open API的URL 引言 VPC提供了豐富的API接口,讓網絡工程是可以通過API調用的方式

Struts2框架使用(一)之Struts2一個HelloWorld

同時 style test 框架 exceptio world utf-8 dispatch har 這裏記一下第一次Struts2框架的使用方法,首先學會使用Struts2寫一個HelloWorld。 首先導入Struts2所依賴得jar包 首先創建一個web工程

python一個簡單的excel表格獲取當時的linux系統信息

psutil 生成 之前 建立 set ces ext 流量 關閉 最近在學習excel表格的制作,順便結合之前學習的內容,利用python的兩個模板,分別是獲取系統信息的psutil,和生成excel表格的xlsxwriter。利用這兩個模板將生成一個簡單的excel表格

python一個九九乘法表-2月19日/2018

九九乘法 while -c pos ont 九九 pytho 九九乘法表 font first = 1 while first<=9:   sec=1   while sec<=first:     print(str(sec),"x",str(first),

shell一個簡易計算器,可以實現加除運算,假如腳本名字為1.sh,執行示例:./1.

a-z 依次 腳本 als 示例 內置 數位 特殊字符 使用 用shell寫一個簡易計算器,可以實現加、減、乘、除運算,假如腳本名字為1.sh,執行示例:./1.sh 1 + 2#!/bin/bash if [ $# -ne 3 ] then echo "參

Canvas一個簡單的遊戲--別踩白塊兒

來吧 ber -c [] for 輸入 itl event 內部   第一次寫博客也不知怎麽寫,反正就按照我自己的想法來吧!怎麽說呢?還是不要扯那些多余的話了,直接上正題吧! 第一次用canvas寫遊戲,所以挑個簡單實現點的來幹:別踩白塊兒,其他那些怎麽操作的那些就不用再扯

shell一個簡單的告警系統

shell用shell寫一個簡單的告警系統 創建目錄結構 mkdir -p /usr/local/sbin/mon/{bin,conf,shares,mail,log} mon //主目錄 bin //主程序目錄 shares //子程序目錄 mail //發郵件目錄 log //日誌目錄 程序主入

python一個restful API

python restful # -*- coding: utf-8 -*- # 作者: 煮酒品茶 """ package.module ~~~~~~~~~~~~~~ python實現的圖書的一個restful api. 參考restful設計指南 URL:

python一個微信聊天機器人

python wechat 聊天機器人 # -*- coding: utf-8 -*- """ package.module ~~~~~~~~~~~~~~ 一個微信機器人程序 微信客戶端itchat: http://itchat.readthed

python一個微信跳一跳外掛,瞬間稱霸朋友圈

python 微信 跳一跳 爬蟲12月28日,微信宣布,小程序增加了新的類目:小遊戲,同時上線小遊戲 你們跳的再好,在毫無心理波動的程序面前都是渣渣。 剛剛會python的小白想玩怎麽辦? 下有詳細的教程,哈哈,包教會不收任何的費用。 感受一下被支配的恐懼吧: 使用工具1.python3.6 2.adb 3

在上線項目中,Vue一個星級評價

spa align wid cti function top icon com ont 先看一下效果: html: <div class="big-star-box"> <img :src="imgNum>0 ?