游戲服務器框架:Leaf/go

jopen 9年前發布 | 92K 次閱讀 游戲 游戲開發

Leaf 是一個使用 Go 語言開發的開源游戲服務器框架,注重運行效率并追求極致的開發效率。Leaf 適用于幾乎所有的游戲類型。其主要的特性:

  • 良好的使用體驗。Leaf 總是盡可能的提供簡潔和易用的接口,盡可能的提升開發的效率

  • 穩定性。Leaf 總是盡可能的恢復運行過程中的錯誤,避免崩潰

  • 多核支持。Leaf 通過模塊機制和 leaf/go 盡可能的利用多核資源,同時又盡量避免各種副作用

  • 良好的模塊支持。

一個 Leaf 開發的游戲服務器由多個模塊組成(例如 LeafServer),模塊有以下特點:

  • 每個模塊運行在一個單獨的 goroutine 中

  • 模塊間通過一套輕量的 RPC 機制通訊(leaf/chanrpc

Leaf 不建議在游戲服務器中設計過多的模塊。

游戲服務器在啟動時進行模塊的注冊,例如:

leaf.Run(
    game.Module,
    gate.Module,
    login.Module,
)

這里按順序注冊了 game、gate、login 三個模塊。每個模塊都需要實現接口:

type Module interface {    OnInit()    OnDestroy()    Run(closeSig chan bool)
}

Leaf 首先會在同一個 goroutine 中按模塊注冊順序執行模塊的 OnInit 方法,等到所有模塊 OnInit 方法執行完成后則為每一個模塊啟動一個 goroutine 并執行模塊的 Run 方法。最后,游戲服務器關閉時(Ctrl + C 關閉游戲服務器)將按模塊注冊相反順序在同一個 goroutine 中執行模塊的 OnDestroy 方法。

Leaf 源碼概覽

  • leaf/chanrpc 提供了一套基于 channel 的 RPC 機制,用于游戲服務器模塊間通訊

  • leaf/db 數據庫相關,目前支持 MongoDB

  • leaf/gate 網關模塊,負責游戲客戶端的接入

  • leaf/go 用于創建能夠被 Leaf 管理的 goroutine

  • leaf/log 日志相關

  • leaf/network 網絡相關,使用 TCP 協議,可自定義消息格式,目前 Leaf 提供了基于 protobuf 和 JSON 的消息格式

  • leaf/recordfile 用于管理游戲數據

  • leaf/timer 定時器相關

  • leaf/util 輔助庫

使用 Leaf 開發游戲服務器

LeafServer 是一個基于 Leaf 開發的游戲服務器,我們以 LeafServer 作為起點。

獲取 LeafServer:

git clone https://github.com/name5566/leafserver

設置 leafserver 目錄到 GOPATH 后獲取相關依賴:

go get github.com/name5566/leaf
go get github.com/golang/protobuf/proto
go get gopkg.in/mgo.v2

編譯 LeafServer:

go install server

如果一切順利,運行 server 你可以獲得以下輸出:

2015/08/26 22:11:27 [release] Leaf starting up

敲擊 Ctrl + C 關閉游戲服務器,服務器正常關閉輸出:

2015/08/26 22:12:30 [release] Leaf closing down (signal: interrupt)

項目主頁:http://www.baiduhome.net/lib/view/home/1440855968810

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!