游戲服務器框架:Leaf/go
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)