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

go實現一個簡單的遊戲伺服器框架(lotou)起源

程式碼倉庫,目前程式碼比較粗糙,歡迎各種改進建議。
最近一直想學習一些關於遊戲伺服器的知識,顯示看了一下雲風的skynet框架,從而對於一個遊戲伺服器框架有了一個基本概要了解。先來說說我對於skynet的一些理解吧。

skynet理解

skynet只完成了伺服器最核心的一部分功能,必須訊息分發,必須服務的建立、銷燬以及服務間的通訊。
skynet中最核心的兩個部分,網路和訊息分發。

訊息分發

skynet中有一個訊息佇列的佇列,這個佇列儲存了每一個服務的訊息佇列,當傳送訊息的時候,將訊息放入指定伺服器的訊息佇列中,然後有1-N個工作執行緒,負責從佇列中取出一個伺服器的訊息,然後在這個執行緒中對這些訊息進行處理,當處理完畢之後又放回到訊息佇列中,這樣就保證一個服務的訊息,每次分發都只會在一個執行緒中執行,從而避免了一些不必要的資源競爭(因為一個服務的邏輯只會同時在一個執行緒中執行,所以在一個服務邏輯內部不需要考慮資源競爭)。
當然這裡進行訊息分發還有一些其他原則來保證一個服務不會太長時間佔用工作執行緒。
當然,針對伺服器,雲風還在lua層做了很多重要的處理,這裡就不細說了。

網路

所有的網路操作,最終都統一到了一個網路執行緒中,在這個執行緒中使用了epoll模式來實現高併發的網路模型,在socket中,每一個fd都會和一個服務相關聯,當該fd上有訊息到來的時候,對應的訊息會被轉發到fd對應的服務的訊息佇列中,這樣服務就可以對網路訊息進行處理了,同時對fd的寫操作也會被分發到該執行緒,並在fd可寫的時候,進行訊息傳送。

多節點

然後在基於上述訊息分發和網路的基礎上,skynet還構建了一個基於master-slave的多節點系統,通過服務的全域性名字和節點ID|服務ID,將訊息從一個節點分發到另外一個節點對應的服務中。

在看完skynet之後,當然也只是一知半解,不過基本還是達到了可以使用的程度了。但是當準備開始用它來寫一個遊戲伺服器的時候,還是發現有點力不從心,一是skynet只是一個核心,真要用他來實現功能,其實還需要很多其他的東西,比如資料庫,比如http,通訊協議…等等,當然這些都是可以解決的,也已經有很多人用skynet寫了遊戲伺服器,但是中最要的一點還是我不太習慣動態語言,使用lua來寫程式碼,讓我很沒有底氣。一個簡單的大小寫都要等到執行時才能檢測得到。
就是在這樣一種心態下,我開始接觸了go語言,一個靜態型別、編譯、類C的語言,並且支援高併發和一樣很好的封裝了通訊和網路介面。
通過幾天的go語言學習,我決定用它來實現自己的第一個遊戲伺服器框架,因為以前沒有怎麼接觸過遊戲伺服器程式設計,所以就只好模擬一下skynet的行為了。