搭建遊戲伺服器腳手架 & 快速上手開發
系列文章
介紹
這將是一個完整的,完全踐行 DevOps/GitOps
與 Kubernetes
上雲流程的 Golang 遊戲伺服器開發的系列教程。
這個系列教程是對開源專案 Nanoserver
的完整拆解,旨在幫助大家快速上手 Golang(遊戲)伺服器後端開發。通過實踐去理解 Golang 開發的精髓 —— Share memory by communication(通過通訊共享記憶體)
。
同時這個專案可能還會涉及到 Linux
效能調優(BPF相關的工具)和系統保障(SRE)的相關的工作。
腳手架專案
- 腳手架是基於
nanoserver
抽出來的,旨在幫助大家快速理解這個Mahjong Server
是如何搭出來的。 - 我們先
單體架構
理解整體業務 -> 然後再分散式 Nano Server
+微服務
改造(Step-by-Step)。 - Demo:go-mahjong-server
基礎回顧
Go Modules
我的本地環境:
go version
# go version go1.14.14 darwin/amd64
go mod help
Go mod
提供對 modules
操作的訪問。
請注意,所有 go
命令都內建了對 modules
的支援,
不只是'go mod'
。例如,日常的依賴關係新增(adding),刪除(removing),升級(upgrading)和降級(downgrading)應該使用 'go get'
完成。
有關 module
功能的概述,請參見 'go help modules'
。
用法:
go mod <command> [arguments]
download
將模組下載到本地快取edit
通過工具或指令碼編輯 go.modgraph
列印模組依賴圖init
在當前目錄中初始化新模組tidy
新增缺少的內容並刪除未使用的模組vendor
製作第三方依賴包(vendored)的依賴副本verify
驗證依賴項具有預期的內容why
解釋為什麼需要軟體包(packages)或模組(modules)
使用 “go help mod <命令>”
可獲取有關命令的更多資訊。
腳手架基本結構
├── configs # 配置檔案
│ ├── config.toml
├── db # 資料庫(xorm)相關
│ ├── model
│ │ ├── struct.go # database schema
│ ├── const.go
│ ├── logger.go
│ ├── model.go
├── internal
│ ├── game # 遊戲伺服器(Nano server)
│ │ ├── crypto.go
│ │ ├── game.go
│ │ ├── manager.go
│ ├── web # web 伺服器(提供 API)
│ │ ├── web.go
├── pkg # 專案基礎包
│ ├── algoutil # 常用工具函式
│ │ ├── algoutil.go
│ ├── crypto # md5 rsa sha1 x509 base64 相關工具
│ │ ├── crypto.go
│ ├── errutil # 遊戲伺服器中錯誤碼和錯誤資訊統一管理
│ │ ├── code.go
│ │ ├── errutil.go
│ ├── whitelist # 白名單驗證工具函式
│ │ ├── white_list.go
├── protocol # 協議(放所有遊戲)
│ ├── web.go
├── main.go # 入口
Mahjong Server 基礎啟動流程
Everything start with main.go
載入配置檔案
configs/config.toml
core
核心基礎配置webserver
web 伺服器配置game-server
遊戲伺服器配置database
資料庫配置whitelist
白名單配置update
客戶端更新配置
啟動 Game Server
game.Startup()
- 根據配置
config.toml
,列印相關啟動資訊:- 當前遊戲伺服器版本
- 是否強制更新
- 當前心跳時間間隔
- 業務功能配置(如:
房卡設定
) - 註冊遊戲業務邏輯(Nano Components)
- 玩家申請加入俱樂部
- 建立一張桌子
- 根據桌號返回牌桌資料
- 設定桌號對應的牌桌資料
- 檢查登入玩家關閉應用之前是否正在遊戲
- 網路斷開後, 重新連線網路
- 網路斷開後, 如果ReConnect後發現當前正在房間中, 則重新進入, 桌號是之前的桌號
- 應用退出後重新進入房間
- 理牌結束
- 定缺
- 有玩家請求解散房間
- 玩家語音訊息
- 處理踢出玩家和重置玩家訊息(來自http)
- ……
- 註冊遊戲資料包加密管道
pipeline
(Inbound
&Outbound
)
- 根據設定,啟動遊戲伺服器(Nano server)
WithPipeline
WithHeartbeatInterval
WithLogger
WithSerializer
WithComponents
- ……
啟動 Web Server
web.Startup()
- 資料庫設定(
XORM
)DSN
資料庫連線字串ShowSQL
是否顯示生產的 Sql 語句MaxIdleConn
最大空閒連線MaxOpenConn
最大開啟連線 < MaxIdleConnsyncSchema
xorm 同步 model 到資料庫表結構async write channel
資料非同步插入管道,持久化資料async update channel
資料非同步更新管道,持久化資料- 定時
ping
資料庫, 保持連線池連線
- 啟用白名單(風控相關功能)
- API 服務註冊(業務相關介面)
- 登入
- 註冊人數
- 活躍人數
- 同時線上人、桌數
- 留存
- 房卡消耗
- 重置玩家未完成房間狀態
- 設定房卡消耗
- 訊息廣播
- 踢人
- 線上資訊
- 玩家充值
- 玩家資訊查詢
- ……
- 是否啟用
http.ListenAndServeTLS
- Graceful Shutdown(優雅退出,程式關閉前可做一下清理工作)
syscall.SIGINT
syscall.SIGQUIT
syscall.SIGKILL
同時,在 kubernetes
中執行微服務時。我們需要處理 kubernetes
發出的終止訊號。這樣做的正確方法是:
- 監聽
SIGINT
,SIGTERM
- 收到訊號後,將服務置於不健康模式(
/health
路由應返回狀態碼4xx
,5xx
) - 在關閉之前新增寬限期,以允許
kubernetes
將您的應用程式從負載均衡器中移除 - 關閉伺服器和所有開啟的連線
- Shutdown
腦圖
快速上手開發
Docker Compose 本地一鍵啟動 MySql
上篇已有詳細介紹,這裡就不贅述了哈。
雲原生專案實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將遊戲伺服器—第1篇
docker-compose -f docker-compose.mysql.5.7.yaml up # -d
docker-compose -f docker-compose.mysql.5.7.yaml down
使用 Air 進行本地開發
☁️ Live reload for Go apps
go get -u github.com/cosmtrek/air
開發(專案根目錄):
air
使用 VSCode-Go 外掛除錯程式
安裝 Delve
- 開啟
命令皮膚
(Windows/Linux: Ctrl+Shift+P; OSX: Shift+Command+P),
選擇Go: Install/Update Tools,
然後選擇dlv
開始除錯
- 開啟你想要除錯的
package main
原始檔(source file
)或測試檔案(test file
) - 使用以下任何一種方式進行除錯:
- 開啟
命令皮膚
, 選擇Debug: Start Debugging
,然後選擇Go
。 - 開啟除錯視窗(Windows/Linux: Ctrl+Shift+D; OSX: Shift+Command+D),然後點選
Run and Debugs
,然後選擇Go
。 - 從主選單選擇 Run > Start Debugging
- 開啟
我是為少
微信:uuhells123
公眾號:黑客下午茶
加我微信(互相學習交流),關注公眾號(獲取更多學習資料~)