繼上一篇介紹了的分布式游戲服務(wù)器架構(gòu)筐眷,后面的課程我們將對(duì)于架構(gòu)中的每一種服務(wù)和具體技術(shù)細(xì)節(jié)進(jìn)行詳細(xì)介紹恢准。
首先回顧下游戲服務(wù)器架構(gòu)中的列出的服務(wù),包括:
網(wǎng)關(guān)服務(wù)器
中心服務(wù)器
單區(qū)服務(wù)器
跨區(qū)服務(wù)器
鏡像服務(wù)器
今天我們來(lái)介紹游戲服務(wù)器架構(gòu)中至關(guān)重要的服務(wù):網(wǎng)關(guān)服務(wù)器售担。
服務(wù)描述:即用于維持玩家客戶端的連接勇吊,將玩家發(fā)的游戲請(qǐng)求轉(zhuǎn)發(fā)到具體后端服務(wù)的服務(wù)器。
功能特性:
1. 對(duì)外開(kāi)放:即客戶端需要知道網(wǎng)關(guān)的IP和端口顽决,才能連接上來(lái)短条;
2. 統(tǒng)一入口:架構(gòu)中可能存在很多后端服務(wù),如果沒(méi)有一個(gè)統(tǒng)一入口才菠,則客戶端需要知道每個(gè)后端服務(wù)的IP和端口茸时。
3. 請(qǐng)求轉(zhuǎn)發(fā):由于統(tǒng)一了入口,所以網(wǎng)關(guān)必須能將客戶端的請(qǐng)求轉(zhuǎn)發(fā)到準(zhǔn)確的服務(wù)上鸠儿。
4. 無(wú)感更新:由于玩家連接的是網(wǎng)關(guān)服務(wù)器屹蚊,只要連接不斷;更新后端服務(wù)器對(duì)玩家來(lái)說(shuō)是無(wú)感知的进每,或者感知很少(根據(jù)實(shí)現(xiàn)方式不同)汹粤。
一般情況下,有了以上4個(gè)特性田晚,這個(gè)網(wǎng)關(guān)就可以用了嘱兼。
但是如果只有上面4個(gè)特性,我們用Nginx做為網(wǎng)關(guān)也是可以的贤徒,為什么還需要自己做網(wǎng)關(guān)芹壕?
因?yàn)槲覀兊挠螒蚓W(wǎng)關(guān)還需要具備以下特殊功能:
特殊功能:
1. Session認(rèn)證:即能維護(hù)客戶端是否登錄成功的狀態(tài),對(duì)于未登錄的請(qǐng)求接奈,不予以轉(zhuǎn)發(fā)踢涌,從而預(yù)防惡意攻擊。
2. 流量限流:游戲經(jīng)常會(huì)遇到DDOS攻擊序宦,一個(gè)客戶端可以通過(guò)一個(gè)for循環(huán)一直給你發(fā)請(qǐng)求睁壁,所以必須進(jìn)行限制。
3. 踢下線:游戲維護(hù)時(shí)互捌,為了讓玩家能更新補(bǔ)丁潘明,會(huì)將玩家踢下線,重新走一遍登錄流程秕噪,避免客戶端與服務(wù)端的數(shù)據(jù)不一致钳降,造成顯示上的BUG。此外客服也需要經(jīng)常對(duì)一些違規(guī)的玩家進(jìn)行踢下線處理腌巾。
4. 在線統(tǒng)計(jì):為什么網(wǎng)關(guān)來(lái)做在線統(tǒng)計(jì)呢遂填?因?yàn)橹挥兴兴械耐婕疫B接信息铲觉,所以可以輕松統(tǒng)計(jì)當(dāng)前有多少玩家在線。
5. 協(xié)議加密:為了避免客戶端的惡意攻擊城菊,我們需要將請(qǐng)求進(jìn)行加密备燃,由于統(tǒng)一了入口,所以網(wǎng)關(guān)來(lái)做非常容易凌唬。
6. 心跳檢測(cè):用于檢測(cè)客戶端是否已經(jīng)掉線并齐,一般超過(guò)幾分鐘沒(méi)有收到心跳請(qǐng)求,則認(rèn)為客戶端已經(jīng)掉線客税,直接請(qǐng)求登錄數(shù)據(jù)况褪,讓玩家重新走登錄流程。
集成以上的功能后更耻,便形成了以下網(wǎng)關(guān)服務(wù)架構(gòu)圖:
這張圖中的路由控制测垛,會(huì)根據(jù)不同游戲類型會(huì)有所變動(dòng),其中:
1. 后端服務(wù)路由表:維護(hù)了后端當(dāng)前有哪些服務(wù)注冊(cè)到網(wǎng)關(guān)了秧均,以及服務(wù)對(duì)應(yīng)哪些區(qū)服的配置信息食侮。
2. 區(qū)服注冊(cè)表:維護(hù)了當(dāng)前開(kāi)了哪些區(qū)服及區(qū)服信息。
3. 終端管理:所有連接上網(wǎng)關(guān)的設(shè)備或進(jìn)程都被認(rèn)為是一個(gè)終端目胡,終端會(huì)有一個(gè)編號(hào)锯七,這個(gè)編號(hào)對(duì)應(yīng)后端服務(wù)編號(hào)或者玩家編號(hào)。當(dāng)需要轉(zhuǎn)發(fā)消息給后端服務(wù)或客戶端時(shí)誉己,就需要從終端管理里找到具體的連接進(jìn)行消息發(fā)送眉尸。
接下來(lái)用圖示介紹一下,客戶端巨双、網(wǎng)關(guān)服務(wù)器噪猾、后端服務(wù)器的交互流程:
Step1:客戶端連接網(wǎng)關(guān)服務(wù)器筑累,然后發(fā)送登錄請(qǐng)求給網(wǎng)關(guān)袱蜡;
Step2:網(wǎng)關(guān)直接將登錄請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)區(qū)服的后端服務(wù)器進(jìn)行登錄驗(yàn)證;
Step3:后端服務(wù)器驗(yàn)證成功后慢宗,會(huì)返回登錄信息給網(wǎng)關(guān)坪蚁;
Step4:網(wǎng)關(guān)會(huì)根據(jù)登錄信息維持一個(gè)Session映射,用于安全驗(yàn)證和重登判斷婆廊,然后轉(zhuǎn)發(fā)登錄信息給客戶端迅细;
Step5:客戶端收到登錄成功消息后巫橄,就可以發(fā)送業(yè)務(wù)請(qǐng)求給網(wǎng)關(guān)了淘邻;
Step6;網(wǎng)關(guān)收到業(yè)務(wù)請(qǐng)求后湘换,會(huì)先判斷玩家是否登錄過(guò)宾舅,登錄過(guò)的才轉(zhuǎn)發(fā)給后端服務(wù)器统阿,并且在協(xié)議頭增加玩家標(biāo)記;
Step7:后端服務(wù)器收到業(yè)務(wù)請(qǐng)求后筹我,根據(jù)協(xié)議頭的玩家標(biāo)記扶平,找到玩家的數(shù)據(jù)進(jìn)行業(yè)務(wù)處理,然后返回給網(wǎng)關(guān)蔬蕊;
Step8:網(wǎng)關(guān)收到業(yè)務(wù)回復(fù)后结澄,直接返回給客戶端;
PS:上面涉及到的一些關(guān)鍵技術(shù)細(xì)節(jié)岸夯,如:流量限流麻献、協(xié)議加密,將會(huì)在后續(xù)的文章中詳細(xì)介紹算法猜扮。