1. 程式人生 > >go實現一個簡單的遊戲伺服器框架(lotou)基本設計

go實現一個簡單的遊戲伺服器框架(lotou)基本設計

程式碼倉庫,目前程式碼比較粗糙,歡迎各種改進建議。
因為go語言原生支援高併發(goroutine)和通訊機制(channel),所以首先想到的就是使用這兩個東西來構建我的訊息分發機制。
核心思路:

  • 有一個core模組維護了所有的服務
  • 當有訊息傳送的時候,通過該core模組將訊息傳送到對應伺服器的接收channel中
  • 服務中開一個goroutine來從channel取出訊息並處理

主要函式:

  • core.RegisterService(s) 註冊一個服務到core,並且返回服務的id
  • core.Name(id, name) 給一個已經註冊的服務取名字,以.開頭的名字表示本地名字,其他的表示全域性名字,如果是多節點的時候,可以被註冊到master上。
  • core.SendName(dstServiceName, srcid, param …interface{})
  • core.Send(dstid, srcid, param …interface{}) 傳送訊息到指定服務,可以通過id或者名字來發送
  • core.Close(dstid, srcid) 傳送關閉訊息給服務,同時將服務從core模組中移除。
    目前只支援一個服務的訊息只在一個goroutine中處理,且也只在這個goroutinue傳送該服務的訊息,如果在多個goroutinue處理,core模組中實現的service基本功能部分可能會有競爭風險,處理如下:
    OUTER_FOR:
        for
{ msg, ok := <-m.In() if !ok { log.Info("m.In is closed.") a <- 1 break OUTER_FOR } m.DispatchM(msg) }

其中m就是一個service,DispatchM函式是在core模組內部實現的,這個函式會把訊息分發到註冊dispatcher的對應方法中,一般dispatcher就是就是service自身。