
搭建游戲服務器腳手架 & 快速上手開發
系列文章
介紹
這將是一個完整的,完全踐行 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核心基礎配置webserverweb 服務器配置game-server游戲服務器配置database數據庫配置whitelist白名單配置update客戶端更新配置
啟動 Game Server
game.Startup()
- 根據配置
config.toml,打印相關啟動信息:- 當前游戲服務器版本
- 是否強制更新
- 當前心跳時間間隔
- 業務功能配置(如:
房卡設置) - 注冊游戲業務邏輯(Nano Components)
- 玩家申請加入俱樂部
- 創建一張桌子
- 根據桌號返回牌桌數據
- 設置桌號對應的牌桌數據
- 檢查登錄玩家關閉應用之前是否正在游戲
- 網絡斷開后, 重新連接網絡
- 網絡斷開后, 如果ReConnect后發現當前正在房間中, 則重新進入, 桌號是之前的桌號
- 應用退出后重新進入房間
- 理牌結束
- 定缺
- 有玩家請求解散房間
- 玩家語音消息
- 處理踢出玩家和重置玩家消息(來自http)
- ……
- 注冊游戲數據包加密管道
pipeline(Inbound&Outbound)
- 根據設置,啟動游戲服務器(Nano server)
WithPipelineWithHeartbeatIntervalWithLoggerWithSerializerWithComponents- ……
啟動 Web Server
web.Startup()
- 數據庫設置(
XORM)DSN數據庫連接字符串ShowSQL是否顯示生產的 Sql 語句MaxIdleConn最大空閑連接MaxOpenConn最大打開連接 < MaxIdleConnsyncSchemaxorm 同步 model 到數據庫表結構async write channel數據異步插入管道,持久化數據async update channel數據異步更新管道,持久化數據- 定時
ping數據庫, 保持連接池連接
- 啟用白名單(風控相關功能)
- API 服務注冊(業務相關接口)
- 登錄
- 注冊人數
- 活躍人數
- 同時在線人、桌數
- 留存
- 房卡消耗
- 重置玩家未完成房間狀態
- 設置房卡消耗
- 消息廣播
- 踢人
- 在線信息
- 玩家充值
- 玩家信息查詢
- ……
- 是否啟用
http.ListenAndServeTLS - Graceful Shutdown(優雅退出,程序關閉前可做一下清理工作)
syscall.SIGINTsyscall.SIGQUITsyscall.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
公眾號:黑客下午茶
加我微信(互相學習交流),關注公眾號(獲取更多學習資料~)
