雲原生專案實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將遊戲伺服器—第2篇

為少發表於2021-02-04

搭建遊戲伺服器腳手架 & 快速上手開發

系列文章

  1. 雲原生專案實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將遊戲伺服器—第1篇

介紹

這將是一個完整的,完全踐行 DevOps/GitOpsKubernetes 上雲流程的 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.mod
  • graph 列印模組依賴圖
  • 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()

  1. 根據配置config.toml,列印相關啟動資訊:
    • 當前遊戲伺服器版本
    • 是否強制更新
    • 當前心跳時間間隔
  2. 業務功能配置(如:房卡設定
  3. 註冊遊戲業務邏輯(Nano Components)
    • 玩家申請加入俱樂部
    • 建立一張桌子
    • 根據桌號返回牌桌資料
    • 設定桌號對應的牌桌資料
    • 檢查登入玩家關閉應用之前是否正在遊戲
    • 網路斷開後, 重新連線網路
    • 網路斷開後, 如果ReConnect後發現當前正在房間中, 則重新進入, 桌號是之前的桌號
    • 應用退出後重新進入房間
    • 理牌結束
    • 定缺
    • 有玩家請求解散房間
    • 玩家語音訊息
    • 處理踢出玩家和重置玩家訊息(來自http)
    • ……
  4. 註冊遊戲資料包加密管道
    • pipeline(Inbound & Outbound)
  5. 根據設定,啟動遊戲伺服器(Nano server)
    • WithPipeline
    • WithHeartbeatInterval
    • WithLogger
    • WithSerializer
    • WithComponents
    • ……

啟動 Web Server

web.Startup()

  1. 資料庫設定(XORM)
    • DSN 資料庫連線字串
    • ShowSQL 是否顯示生產的 Sql 語句
    • MaxIdleConn 最大空閒連線
    • MaxOpenConn 最大開啟連線 < MaxIdleConn
    • syncSchema xorm 同步 model 到資料庫表結構
    • async write channel 資料非同步插入管道,持久化資料
    • async update channel 資料非同步更新管道,持久化資料
    • 定時 ping 資料庫, 保持連線池連線
  2. 啟用白名單(風控相關功能)
  3. API 服務註冊(業務相關介面)
    • 登入
    • 註冊人數
    • 活躍人數
    • 同時線上人、桌數
    • 留存
    • 房卡消耗
    • 重置玩家未完成房間狀態
    • 設定房卡消耗
    • 訊息廣播
    • 踢人
    • 線上資訊
    • 玩家充值
    • 玩家資訊查詢
    • ……
  4. 是否啟用 http.ListenAndServeTLS
  5. Graceful Shutdown(優雅退出,程式關閉前可做一下清理工作)
    • syscall.SIGINT
    • syscall.SIGQUIT
    • syscall.SIGKILL

同時,在 kubernetes 中執行微服務時。我們需要處理 kubernetes 發出的終止訊號。這樣做的正確方法是:

  1. 監聽 SIGINT, SIGTERM
  2. 收到訊號後,將服務置於不健康模式(/health 路由應返回狀態碼 4xx5xx
  3. 在關閉之前新增寬限期,以允許 kubernetes 將您的應用程式從負載均衡器中移除
  4. 關閉伺服器和所有開啟的連線
  5. 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 外掛除錯程式

VSCode-Go Debugging

安裝 Delve

  1. 開啟 命令皮膚(Windows/Linux: Ctrl+Shift+P; OSX: Shift+Command+P),
    選擇 Go: Install/Update Tools, 然後選擇 dlv

開始除錯

  1. 開啟你想要除錯的 package main 原始檔(source file)或測試檔案(test file)
  2. 使用以下任何一種方式進行除錯:
    • 開啟 命令皮膚, 選擇 Debug: Start Debugging,然後選擇 Go
    • 開啟除錯視窗(Windows/Linux: Ctrl+Shift+D; OSX: Shift+Command+D),然後點選 Run and Debugs,然後選擇 Go
    • 從主選單選擇 Run > Start Debugging

我是為少
微信:uuhells123
公眾號:黑客下午茶
加我微信(互相學習交流),關注公眾號(獲取更多學習資料~)

相關文章