遊戲伺服器設計 Unity3d + photon + grpc + nodejs + postgis/postgresql
unity3d + photon + grpc + nodejs + postgis/postgresql 遊戲伺服器設計
遊戲型別:MMORPG
如果想使用grpc替換photon完成通訊(長連結替換成短連線),可參考此部落格:
團隊由於缺少遊戲網路層的設計經驗,於是就採用市面上比效常用的伺服器 photon 來做。
具體到語言:unity3d 使用 c# , android 使用 java,photon 使用 c# 。
做技術選型的時候,想了很久,想統一技術的基礎,也就是說伺服器端也採用 c#, 嘗試 c# 寫了幾個小 demo,覺得自己還是缺少必要的技能,於是還是選擇了熟悉的工具 node.js。
由於 photon 是 c# 為主要核心的,所以還要選擇 photon 與 node.js 的網路層協議,在網上找了一圈,發現 grpc 不錯,然後寫了一個 demo 互相能調通,就決定以 node.js + grpc 做為構建項面的核心來做。
規劃一下專案的整體結構如下圖所示:
pikachu-net,就是以 photon 為核心的遊戲伺服器,它管理所有的 unity3d 客戶端的連線,長連線的形式,是有狀態的。會把所有的業務相關的請求轉發到 pikachu-node,如登入,註冊等。
pikachu-node, 主要是業務處理邏輯,能遊戲的登入等。pikachu-net 與 pikachu-node 之間用 grpc 進行連線。pikachu-node 做成了沒有狀態服務,所以可以部署成叢集的形式。
下面詳細說說 pikachu-node 的實現:
由於遊戲跟地理位置有關,所以使用了 postgis/postgresql,node.js 下面就使用 knex.js 做為連線工具。
市面上也沒有對 grpc 的多個服務的整合使用經驗,所以參考 express 的中介軟體設計理念,自己設計一個 node.js 的 grpc 框架用來組織程式碼的結構。
在node.js 中 grpc 沒有使用 靜態編繹模式,而是直接把 proto 檔案進行載入的形式進行處理。
程式碼管理使用 oschina git 的私庫。伺服器使用 阿里雲,系統是 windows 的,沒有辦法 photon 只能布在 windows 上。
部署程式碼開始一段時間,是使用 ftp 進行拷貝,發現太難受了。於是用 oschina git 的 webhook 和 express 寫了一個釋出服務,當我的程式碼推到 git 上時,就自動更新程式碼,重啟服務,事實證明,這項工作太明智了,省了很多的時間。
node.js 的程式碼服務都是使用 pm2 進行管理的。
之後日誌的檢視也是一個問題,因為windows 上沒有 ssh,只能用遠端登入來檢視,當前win只有一個使用者,所以不能兩個人同時線上,新的會把舊的踢下線,這是多煩,每次檢視日誌只能叫我來看,於是用 express + socket.io 開發了一個簡單的網頁版的日誌檢視頁面。這下世界都安靜了。
pikachu-net,每次都是在本地編繹好,然後上傳到伺服器,後來我也把這個加入到釋出服務,之後就能推上程式碼直接重啟服務。
之後的規劃:
資料庫管理要做起來,因為目前資料庫欄位都是手工建立,如果要佈一個測試環境,就很難受。
如果想使用grpc替換photon完成通訊,可參考此部落格: