雲原生專案實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將遊戲伺服器—第3篇
阿新 • • 發佈:2021-02-07
![](https://img2020.cnblogs.com/blog/436453/202102/436453-20210207104600178-1879482117.jpg)
## 通過伺服器日誌和客戶端抓包瞭解遊客(Guest)登入流程
### 系列文章
1. [雲原生專案實踐DevOps(GitOps)+K8S+BPF+SRE,從0到1使用Golang開發生產級麻將遊戲伺服器—第1篇](https://mp.weixin.qq.com/s/Jyq_A1vehrnMwv6AdOtQ1w)
2. [雲原生專案實踐 DevOps(GitOps)+K8S+BPF+SRE,從 0 到 1 使用 Golang 開發生產級麻將遊戲伺服器—第2篇](https://mp.weixin.qq.com/s/jnQaz08fAzQ3J7tZBdil4Q)
### 介紹
這將是一個完整的,完全踐行 `DevOps/GitOps` 與 `Kubernetes` 上雲流程的 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](https://github.com/Hacker-Linner/go-mahjong-server)
## 遊客登入業務分析
`遊客(Guest)登入` 這裡主要還是用於開發與除錯程式。
### 回顧一下 Nano 框架
關於 `Nano Game Server` 的快速上手大家可以參看我之前寫的 -> [5 分鐘上手 Nano 遊戲伺服器框架](https://mp.weixin.qq.com/s/lTAbQm4VAPysyOhFYqnHzQ)
**Nano 術語**
* 元件(`Component`):`nano` 應用的功能就是由一些鬆散耦合的 `Component` 組成的,每個 `Component` 完成一些功能。
* `Handler`:它定義在 `Component` 內的方法,用來處理具體的業務邏輯。
* 路由(`Route`):用來標識一個`具體服務` 或者客戶端接受服務端推送訊息的`位置`。
* 會話(`Session`):客戶端連線伺服器後, 建立一個會話儲存連線期間一些上下文資訊。連線斷開後釋放。
* 組(`Group`):`Group` 可以看作是一個 `Session` 的容器,主要用於需要廣播推送訊息的場景。
* 請求(`Request`), 響應(`Response`), 通知(`Notify`), 推送(`Push`):`Nano` 中四種訊息型別。
**Nano 元件的生命週期**
```go
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()`
```go
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(),
)
```
### 啟動遊戲伺服器並檢視其啟動日誌
![](https://img2020.cnblogs.com/blog/436453/202102/436453-20210207104623113-284169475.jpg)
這個主要是瞭解 `Nano` Server 啟動的時候都註冊了哪些遊戲