雲原生項目實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將游戲服務器—第3篇


通過服務器日志和客戶端抓包了解游客(Guest)登錄流程

系列文章

  1. 雲原生項目實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將游戲服務器—第1篇
  2. 雲原生項目實踐 DevOps(GitOps)+K8S+BPF+SRE,從 0 到 1 使用 Golang 開發生產級麻將游戲服務器—第2篇

介紹

這將是一個完整的,完全踐行 DevOps/GitOpsKubernetes 上雲流程的 Golang 游戲服務器開發的系列教程。

這個系列教程是對開源項目 Nanoserver 的完整拆解,旨在幫助大家快速上手 Golang(游戲)服務器后端開發。通過實踐去理解 Golang 開發的精髓 —— Share memory by communication(通過通信共享內存)

同時這個項目可能還會涉及到 Linux 性能調優(BPF 相關的工具)和系統保障(SRE)的相關的工作。

Step-By-Step 開發 Mahjong Server

  • 單體架構理解 Mahjong Server 業務 -> Nano Distributed Game Server(分布式) + 微服務 改造。
  • Demo:go-mahjong-server

游客登錄業務分析

游客(Guest)登錄 這里主要還是用於開發與調試程序。

回顧一下 Nano 框架

關於 Nano Game Server 的快速上手大家可以參看我之前寫的 -> 5 分鍾上手 Nano 游戲服務器框架

Nano 術語

  • 組件(Component):nano 應用的功能就是由一些松散耦合的 Component 組成的,每個 Component 完成一些功能。
  • Handler:它定義在 Component 內的方法,用來處理具體的業務邏輯。
  • 路由(Route):用來標識一個具體服務 或者客戶端接受服務端推送消息的位置
  • 會話(Session):客戶端連接服務器后, 建立一個會話保存連接期間一些上下文信息。連接斷開后釋放。
  • 組(Group):Group 可以看作是一個 Session 的容器,主要用於需要廣播推送消息的場景。
  • 請求(Request), 響應(Response), 通知(Notify), 推送(Push):Nano 中四種消息類型。

Nano 組件的生命周期

type DemoComponent struct{}

func (c *DemoComponent) Init()           {}
func (c *DemoComponent) AfterInit()      {}
func (c *DemoComponent) BeforeShutdown() {}
func (c *DemoComponent) Shutdown()       {}
  • Init:組件初始化時將被調用。
  • AfterInit:組件初始化完成后將被調用。
  • BeforeShutdown:組件銷毀之前將被調用。
  • Shutdown:組件銷毀時將被調用。

整個組件的生命周期看起來非常的清晰。

Nano Game Server 開啟 Debug 模式

internal/game/game.go,我加入了 nano.WithDebugMode()

nano.Listen(addr,
  nano.WithPipeline(pip),
  nano.WithHeartbeatInterval(time.Duration(heartbeat)*time.Second),
  nano.WithLogger(log.WithField("component", "nano")),
  nano.WithSerializer(json.NewSerializer()),
  nano.WithComponents(comps),
  nano.WithDebugMode(),
)

啟動游戲服務器並查看其啟動日志

這個主要是了解 Nano Server 啟動的時候都注冊了哪些游戲🎮業務邏輯。

日志 -> The current server running in singleton mode:這句話告訴我們 Nano 服務器當前啟動模式是單體。Nano 也可以作為分布式系統運行,他內置了一個小型的分布式系統設計(可以學習下它的架構,入門分布式系統開發)。

通過日志我們清晰的看到,Nano 注冊了三個組件 ManagerDeskManagerClubManager,用來管理所有的游戲🎮業務邏輯。

Manager(Handlers):

  • Manager.CheckOrder
  • Manager.Login

DeskManager(Handlers):

  • DeskManager.DissolveStatus
  • DeskManager.QiPaiFinished
  • DeskManager.VoiceMessage
  • DeskManager.ClientInitCompleted
  • DeskManager.Exit
  • DeskManager.OpChoose
  • DeskManager.Ready
  • DeskManager.UnCompleteDesk
  • DeskManager.DingQue
  • DeskManager.Dissolve
  • DeskManager.Join
  • DeskManager.ReJoin
  • DeskManager.RecordingVoice
  • DeskManager.Resume
  • DeskManager.CreateDesk
  • DeskManager.Pause
  • DeskManager.ReConnect
  • DeskManager.ReEnter

ClubManager(Handlers):

  • ClubManager.ApplyClub

分析 Nano Debug 日志和 Charles 捕獲

如何代理 API 到本地 Nanoserver 和以及捕獲 http 請求? -> 大家可以參看系列的第一篇

Charles API 捕獲

我們清晰的看到這一次的操作調用了兩個 API

  1. /v1/user/login/query -> 查詢是否已啟用游客(Guest)登錄
POST http://192.168.31.125:12307/v1/user/login/query HTTP/1.1
content-type: application/json

{
    "channelId": "konglai",
    "appId": "konglai"
}
  1. /v1/user/login/guest -> 進行游客登錄
POST http://192.168.31.125:12307/v1/user/login/guest HTTP/1.1
content-type: application/json

{
    "channelId": "konglai",
    "appId": "konglai",
    "imei": "c0a4ce912c48a3d0b17b59e6b97f1dca"
}

服務器 Debug 日志輸出

我們看到了 Nano Server 輸出的如下關鍵信息:

  1. Message={ Request Manager.Login }
  2. Message={ Request DeskManger.UnCompleteDesk}

客戶端根據 Web API(v1/user/login/guest) 返回的游戲服務器地址 192.168.31.125:33251,進行了 socket 連接並與 Nano Game Server 進行了通訊。

關於 Nano 協議快速入門,大家可查看: 3分鍾快速理解 Nano 通信協議(內含記憶腦圖)

最后,一句話描述業務流程

用戶單擊登錄按鈕 -> 查詢服務器是否啟用游客(Guest)登錄 -> (如果啟用?)進行游客登錄 -> 獲取游戲服務器地址 -> 連接游戲服務器 -> (連接成功?)進入游戲大廳

關於登錄流程的詳細業務和代碼邏輯,我們下篇再詳細討論。

我是為少
微信:uuhells123
公眾號:黑客下午茶


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM