- Java游戲服務(wù)器架構(gòu)實(shí)戰(zhàn)
- 王廣帥編著
- 1034字
- 2025-03-19 16:19:11
1.3.2 網(wǎng)關(guān)
網(wǎng)關(guān)就是網(wǎng)絡(luò)通信的第一關(guān),是服務(wù)器上所有服務(wù)的大門。它負(fù)責(zé)與外界聯(lián)系,并且可以“辨正邪,識(shí)真?zhèn)巍保WC內(nèi)部服務(wù)收到的都是合法消息,限制請(qǐng)求流量,防止請(qǐng)求超載。如圖1.2所示,因?yàn)槲覀冇袃煞N不同的通信方式,長(zhǎng)連接通信和短連接通信,所以這里我們定義了兩種不同的網(wǎng)關(guān),用于處理不同協(xié)議的請(qǐng)求。
網(wǎng)關(guān)基本的職責(zé)主要有以下幾點(diǎn)。
●權(quán)限驗(yàn)證。保證請(qǐng)求合法。
●數(shù)據(jù)加密解密。保證數(shù)據(jù)安全,防止消息被修改。
●消息路由。分發(fā)客戶端消息到指定的服務(wù)。
●負(fù)載均衡。當(dāng)請(qǐng)求過大,負(fù)責(zé)分流到多個(gè)服務(wù)處理。
●請(qǐng)求流量控制。將請(qǐng)求流量控制在一定范圍內(nèi),防止流量過大,導(dǎo)致服務(wù)器崩潰。
●如果是長(zhǎng)連接,管理長(zhǎng)連接,使用心跳檢測(cè)保證連接正常或關(guān)閉空閑連接。
●支持不同的協(xié)議,將收到的客戶端消息使用統(tǒng)一的協(xié)議發(fā)送到業(yè)務(wù)服務(wù)。
網(wǎng)關(guān)像一個(gè)過濾器,檢測(cè)并攔截一切非法請(qǐng)求。如果收到非法請(qǐng)求,在網(wǎng)關(guān)就會(huì)將其處理掉,而不會(huì)讓它穿透到業(yè)務(wù)服務(wù)那里。這樣在做業(yè)務(wù)服務(wù)開發(fā)的時(shí)候,特別是在做分布式服務(wù)時(shí),就不用每個(gè)服務(wù)再去做請(qǐng)求檢測(cè)了,只關(guān)注業(yè)務(wù)功能開發(fā)即可。
網(wǎng)關(guān)也像一個(gè)路由器,負(fù)責(zé)客戶端請(qǐng)求消息的轉(zhuǎn)發(fā)和服務(wù)器響應(yīng)消息的返回。這樣不管網(wǎng)關(guān)后面有多少個(gè)業(yè)務(wù)服務(wù),客戶端只需要與網(wǎng)關(guān)建立一條連接即可和所有業(yè)務(wù)服務(wù)通信。
網(wǎng)關(guān)又像一個(gè)閥門,控制客戶端請(qǐng)求的頻率,防止請(qǐng)求過載導(dǎo)致服務(wù)崩潰。這主要是針對(duì)一些惡意客戶端用戶,防止它們使用連發(fā)工具,繞開客戶端代碼的正常防護(hù),對(duì)服務(wù)器發(fā)送大量無(wú)用的請(qǐng)求,造成資源浪費(fèi)。還有惡意者獲取服務(wù)器的IP地址和端口之后,通過某種手段建立大量的空閑連接(只是建立連接,而不發(fā)送任何消息),導(dǎo)致連接長(zhǎng)時(shí)間被占滿,使用戶連接不上服務(wù)器。網(wǎng)關(guān)通過連接空閑檢測(cè),關(guān)閉空閑連接,以節(jié)約服務(wù)器資源給用戶使用。
心跳檢測(cè)是指在客戶端與服務(wù)器都沒有數(shù)據(jù)交互的情況下,一般由客戶端每隔一定時(shí)間向服務(wù)器發(fā)送一個(gè)連接檢測(cè)包,檢測(cè)長(zhǎng)連接是否正常。如果長(zhǎng)時(shí)間未收到任何消息,或在一定時(shí)間內(nèi)收到的都是心跳消息,說(shuō)明當(dāng)前客戶端的連接是空閑的,沒有用戶在操作了,這時(shí),服務(wù)器可以主動(dòng)斷開連接,回收服務(wù)器資源。
網(wǎng)關(guān)也可以對(duì)客戶端不同的協(xié)議進(jìn)行統(tǒng)一轉(zhuǎn)化。比如一個(gè)游戲,剛開始是使用Unity開發(fā)的手機(jī)App客戶端,使用的通信協(xié)議是ProtoBuffer,后來(lái)又想使用H5重新開發(fā)一個(gè)版本,H5使用JSON格式通信,對(duì)于業(yè)務(wù)功能來(lái)說(shuō)都是一樣。所以可以在網(wǎng)關(guān)處把接收到的不同客戶端的消息統(tǒng)一轉(zhuǎn)化為一種格式,然后再轉(zhuǎn)發(fā)到業(yè)務(wù)服務(wù),這樣業(yè)務(wù)服務(wù)不需要任何改動(dòng),就可以支持不同的客戶端類型。
- 零基礎(chǔ)學(xué)Scratch少兒編程:小學(xué)課本中的Scratch創(chuàng)意編程
- Python金融數(shù)據(jù)分析
- PHP+MySQL網(wǎng)站開發(fā)項(xiàng)目式教程
- 零基礎(chǔ)輕松學(xué)SQL Server 2016
- Learning ArcGIS for Desktop
- Android系統(tǒng)原理及開發(fā)要點(diǎn)詳解
- Android傳感器開發(fā)與智能設(shè)備案例實(shí)戰(zhàn)
- 深入解析Java編譯器:源碼剖析與實(shí)例詳解
- Android Sensor Programming By Example
- Java 9 with JShell
- C# 7.1 and .NET Core 2.0:Modern Cross-Platform Development(Third Edition)
- Java語(yǔ)言程序設(shè)計(jì)實(shí)用教程(第2版)
- Flask開發(fā)Web搜索引擎入門與實(shí)戰(zhàn)
- 零基礎(chǔ)學(xué)編程系列(全5冊(cè))
- Building Apple Watch Projects