GoWorld代碼:https://github.com/xiaonanln/goworldgit
Golang具備運行效率高、內存安全等優良特性,所以是很是適合用來進行服務器開發。使用Golang開發遊戲服務器有以下的優勢:github
然而使用Golang編寫遊戲服務器也面臨必定的困難,主要是兩個方面:golang
GoWorld是一個使用Golang實現的可擴展的分佈式遊戲服務器引擎,並致力於解決以上的這些問題。首先,GoWorld提供對象(Entity)框架來爲服務端邏輯開發提供便利。Entity能夠在多個場景(Space)之間進行跳轉,而且提供AOI支持,所以GoWorld能夠很好的支持各類MMORPG遊戲服務器所須要的功能。另一方面,GoWorld經過進程替換來實現遊戲邏輯的熱更新。在熱更新過程當中,玩家的客戶端鏈接和各類遊戲狀態會被保持,並在熱更新結束以後恢復正常遊戲。redis
一個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