Leaf 是一個由 Go 語言(golang)編寫的開發效率和執行效率並重的開源遊戲服務器框架。Leaf 適用於各種遊戲服務器的開發,包括 H5(HTML5)遊戲服務器。git
Leaf 的關注點:github
良好的使用體驗。Leaf 老是儘量的提供簡潔和易用的接口,儘量的提高開發的效率golang
穩定性。Leaf 老是儘量的恢復運行過程當中的錯誤,避免崩潰數據庫
多核支持。Leaf 經過模塊機制和 leaf/go 儘量的利用多核資源,同時又儘可能避免各類反作用。服務器
Leaf 的模塊機制網絡
一個 Leaf 開發的遊戲服務器由多個模塊組成(例如 LeafServer),模塊有如下特色:框架
每一個模塊運行在一個單獨的 goroutine 中ide
模塊間經過一套輕量的 RPC 機制通信(leaf/chanrpc)spa
Leaf 不建議在遊戲服務器中設計過多的模塊。設計
遊戲服務器在啓動時進行模塊的註冊,例如:
leaf.Run(
game.Module,
gate.Module,
login.Module,
)
這裏按順序註冊了 game、gate、login 三個模塊。每一個模塊都須要實現接口:
type Module interface {
OnInit()
OnDestroy()
Run(closeSig chan bool)
}
Leaf 源碼概覽使用 Leaf 開發遊戲服務器
Leaf 首先會在同一個 goroutine 中按模塊註冊順序執行模塊的 OnInit 方法,等到全部模塊 OnInit 方法執行完成後則爲每個模塊啓動一個 goroutine 並執行模塊的 Run 方法。最後,遊戲服務器關閉時(Ctrl + C 關閉遊戲服務器)將按模塊註冊相反順序在同一個 goroutine 中執行模塊的 OnDestroy 方法。
leaf/chanrpc 提供了一套基於 channel 的 RPC 機制,用於遊戲服務器模塊間通信
leaf/db 數據庫相關,目前支持 MongoDB
leaf/gate 網關模塊,負責遊戲客戶端的接入
leaf/go 用於建立可以被 Leaf 管理的 goroutine
leaf/log 日誌相關
leaf/network 網絡相關,使用 TCP 和 WebSocket 協議,可自定義消息格式,默認 Leaf 提供了基於 protobuf 和 JSON 的消息格式
leaf/recordfile 用於管理遊戲數據
leaf/timer 定時器相關
leaf/util 輔助庫
LeafServer 是一個基於 Leaf 開發的遊戲服務器,咱們以 LeafServer 做爲起點。
獲取 LeafServer:
git clone https://github.com/name5566/leafserver
設置 leafserver 目錄到 GOPATH 環境變量後獲取 Leaf:
go get github.com/name5566/leaf
輸出搭建好的編譯運行結果:
-----》》》》 Leaf 1.1.2 starting up