1. 程式人生 > >Go遊戲伺服器開發的一些思考(一):語言層面

Go遊戲伺服器開發的一些思考(一):語言層面

Go是比C++更好用的高階語言

使用Go作為伺服器開發的主語言前,首先需要對Go語言做下定性。在接觸Go前,可能給人的印象(至少是我),Go是一門指令碼語言。看了 官方文件 ,才知道Go是一門高階語言。與C++相比,它有以下優勢:

  • 面向介面的程式設計

    沒有C++複雜的面向物件語法,如類、繼承、多型、虛擬函式等等。Go中只有結構與介面,從語言層面上,直接指導功能與功能間的解耦。直接且語法簡單

  • 提供語言反射機制

    提供了弱反射機制,雖然沒能像指令碼語言那樣可以動態建立屬性、方法等。但也提供了能通過字串來操作結構體、介面的能力

  • 編譯速度很快

    雖然沒有同等量級的C++、Go專案做比較。但是可以明確說 Go編譯速度比C++快非常多

  • 豐富的功能包

    意味著可以用更少的程式碼實現相同的功能

  • 簡化併發模式

    暫時沒仔細研究,但在做網路模組等前,需要詳細瞭解

因此從某種角度來說,可以得出這樣的結論,Go是一個比C++跟好用的高階程式語言

那麼,同為高階語言,對於C++程式出身的、有伺服器開發經驗的人,顯然所有伺服器相關的概念全部可以搬過來。並可以使用Go,以更少程式碼量的方式實現之

引擎模組、應用邏輯框架與具體業務程式碼的分割線

C++伺服器框架通常會使用C++來編寫引擎模組、應用邏輯框架;使用指令碼語言來製作具體業務邏輯。這樣的好處非常明顯,不管專案如何迭代,引擎模組、應用邏輯框架始終有高階程式設計師來維護,從而保持了伺服器框架的質量

Go也可以使用 Go + 指令碼語言 的方式。github上的確有go-python、golua開源專案。考慮到Go在語法、用法上,都有意朝指令碼語言上靠。因此個人認為 Go + 指令碼語言 的做法有些本末倒置。

Go語言提供的介面程式設計,天生可以很好的解決這個問題。
首先以下方式很常見:

  • 引擎模組、應用邏輯框架 單獨成包
    (Go中的包類似於C++中的庫)
    業務邏輯層的程式應避免直接修改 引擎模組、應用邏輯框架。因為過手的人越多,最終會變得無法維護

  • 提供應用程式框架,並定義 啟動 具體應用 的 介面
    介面卡模式。實現適配介面的具體應用,就可以通過引擎框架啟動執行

  • Go語言反射機制可以讓引擎框架自動啟動具體應用

結合以上功能點,Go伺服器在架構上可以分成3部分:

1. 以包形式分發的Go伺服器引擎
    可以是原始碼包 也可以是go build後的2進位制包檔案

2. 應用程式框架
    利用反射機制載入具體應用(Go中表現為具體結構),並根據事先定義好的適配介面,啟動具體應用
    該框架實際上也會隨 Go伺服器引擎 一起分發,單獨拎出來,主要在於它其橋樑作用,不可或缺,必須介紹

3. 具體應用

ps. 上面的3部分還可以做下變形,變成 Go基礎服務節點 + 具體應用的2進位制包 的方式提供(類似 mysql伺服器 載入 某儲存引擎,如 MyISAM 、InnoDB)。我們不做某型別服務 雲提供商,因此這種變形基本上是不會用到的

總結

本節主要從 Go語言性質 說起,介紹了一種 使用Go語言開發,並嚴格限定 引擎模組 和 具體應用的 界限。

接下來的文章,將思考Go遊戲伺服器應當具備哪些功能和開發路徑等問題