繼上一篇介紹了的分布式游戲服務(wù)器架構(gòu),后面的課程我們將對于架構(gòu)中的每一種服務(wù)和具體技術(shù)細節(jié)進行詳細介紹。
首先回顧下游戲服務(wù)器架構(gòu)中的列出的服務(wù),包括:
網(wǎng)關(guān)服務(wù)器
中心服務(wù)器
單區(qū)服務(wù)器
跨區(qū)服務(wù)器
鏡像服務(wù)器
今天我們來介紹游戲服務(wù)器架構(gòu)中至關(guān)重要的服務(wù):網(wǎng)關(guān)服務(wù)器。
服務(wù)描述:即用于維持玩家客戶端的連接,將玩家發(fā)的游戲請求轉(zhuǎn)發(fā)到具體后端服務(wù)的服務(wù)器。
功能特性:
1. 對外開放:即客戶端需要知道網(wǎng)關(guān)的IP和端口,才能連接上來;
2. 統(tǒng)一入口:架構(gòu)中可能存在很多后端服務(wù),如果沒有一個統(tǒng)一入口,則客戶端需要知道每個后端服務(wù)的IP和端口。
3. 請求轉(zhuǎn)發(fā):由于統(tǒng)一了入口,所以網(wǎng)關(guān)必須能將客戶端的請求轉(zhuǎn)發(fā)到準確的服務(wù)上。
4. 無感更新:由于玩家連接的是網(wǎng)關(guān)服務(wù)器,只要連接不斷;更新后端服務(wù)器對玩家來說是無感知的,或者感知很少(根據(jù)實現(xiàn)方式不同)。
一般情況下,有了以上4個特性,這個網(wǎng)關(guān)就可以用了。
但是如果只有上面4個特性,我們用Nginx做為網(wǎng)關(guān)也是可以的,為什么還需要自己做網(wǎng)關(guān)?
因為我們的游戲網(wǎng)關(guān)還需要具備以下特殊功能:
特殊功能:
1. Session認證:即能維護客戶端是否登錄成功的狀態(tài),對于未登錄的請求,不予以轉(zhuǎn)發(fā),從而預(yù)防惡意攻擊。
2. 流量限流:游戲經(jīng)常會遇到DDOS攻擊,一個客戶端可以通過一個for循環(huán)一直給你發(fā)請求,所以必須進行限制。
3. 踢下線:游戲維護時,為了讓玩家能更新補丁,會將玩家踢下線,重新走一遍登錄流程,避免客戶端與服務(wù)端的數(shù)據(jù)不一致,造成顯示上的BUG。此外客服也需要經(jīng)常對一些違規(guī)的玩家進行踢下線處理。
4. 在線統(tǒng)計:為什么網(wǎng)關(guān)來做在線統(tǒng)計呢?因為只有它有所有的玩家連接信息,所以可以輕松統(tǒng)計當前有多少玩家在線。
5. 協(xié)議加密:為了避免客戶端的惡意攻擊,我們需要將請求進行加密,由于統(tǒng)一了入口,所以網(wǎng)關(guān)來做非常容易。
6. 心跳檢測:用于檢測客戶端是否已經(jīng)掉線,一般超過幾分鐘沒有收到心跳請求,則認為客戶端已經(jīng)掉線,直接請求登錄數(shù)據(jù),讓玩家重新走登錄流程。
集成以上的功能后,便形成了以下網(wǎng)關(guān)服務(wù)架構(gòu)圖:

這張圖中的路由控制,會根據(jù)不同游戲類型會有所變動,其中:
1. 后端服務(wù)路由表:維護了后端當前有哪些服務(wù)注冊到網(wǎng)關(guān)了,以及服務(wù)對應(yīng)哪些區(qū)服的配置信息。
2. 區(qū)服注冊表:維護了當前開了哪些區(qū)服及區(qū)服信息。
3. 終端管理:所有連接上網(wǎng)關(guān)的設(shè)備或進程都被認為是一個終端,終端會有一個編號,這個編號對應(yīng)后端服務(wù)編號或者玩家編號。當需要轉(zhuǎn)發(fā)消息給后端服務(wù)或客戶端時,就需要從終端管理里找到具體的連接進行消息發(fā)送。
接下來用圖示介紹一下,客戶端、網(wǎng)關(guān)服務(wù)器、后端服務(wù)器的交互流程:

Step1:客戶端連接網(wǎng)關(guān)服務(wù)器,然后發(fā)送登錄請求給網(wǎng)關(guān);
Step2:網(wǎng)關(guān)直接將登錄請求轉(zhuǎn)發(fā)給對應(yīng)區(qū)服的后端服務(wù)器進行登錄驗證;
Step3:后端服務(wù)器驗證成功后,會返回登錄信息給網(wǎng)關(guān);
Step4:網(wǎng)關(guān)會根據(jù)登錄信息維持一個Session映射,用于安全驗證和重登判斷,然后轉(zhuǎn)發(fā)登錄信息給客戶端;
Step5:客戶端收到登錄成功消息后,就可以發(fā)送業(yè)務(wù)請求給網(wǎng)關(guān)了;
Step6;網(wǎng)關(guān)收到業(yè)務(wù)請求后,會先判斷玩家是否登錄過,登錄過的才轉(zhuǎn)發(fā)給后端服務(wù)器,并且在協(xié)議頭增加玩家標記;
Step7:后端服務(wù)器收到業(yè)務(wù)請求后,根據(jù)協(xié)議頭的玩家標記,找到玩家的數(shù)據(jù)進行業(yè)務(wù)處理,然后返回給網(wǎng)關(guān);
Step8:網(wǎng)關(guān)收到業(yè)務(wù)回復(fù)后,直接返回給客戶端;
PS:上面涉及到的一些關(guān)鍵技術(shù)細節(jié),如:流量限流、協(xié)議加密,將會在后續(xù)的文章中詳細介紹算法。