go實現一個簡單的遊戲伺服器框架(lotou)基本設計
阿新 • • 發佈:2019-01-01
程式碼倉庫,目前程式碼比較粗糙,歡迎各種改進建議。
因為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自身。