1. 程式人生 > >遊戲伺服器框架:Leaf/go

遊戲伺服器框架:Leaf/go

Leaf 是一個使用 Go 語言開發的開源遊戲伺服器框架,注重執行效率並追求極致的開發效率。Leaf 適用於幾乎所有的遊戲型別。其主要的特性:

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

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

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

  • 良好的模組支援。

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

  • 每個模組執行在一個單獨的 goroutine 中

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

Leaf 不建議在遊戲伺服器中設計過多的模組。

遊戲伺服器在啟動時進行模組的註冊,例如:

1

2

3

4

5

leaf.Run(

game.Module,

gate.Module,

login.Module,

)

這裡按順序註冊了 game、gate、login 三個模組。每個模組都需要實現介面:

1

2

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:

1

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

設定 leafserver 目錄到 GOPATH 後獲取相關依賴:

1

2

3

go get github.com/name5566/leaf

go get github.com/golang/protobuf/proto

go get gopkg.in/mgo.v2

編譯 LeafServer:

1

go install server

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

1

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

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

1

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

學習時的痛苦是暫時的 未學到的痛苦是終生的