當用戶在大廳登陸成功之后,大廳會分配一個網關的地址給客戶端。客戶端與這個網關建立長連接,負責與服務器的通信。網關的主要功能有:
- 消息解析
- 與客戶端保持連接
- 消息合法性驗證
- 轉發消息到業務服務
- 流量限制
- 版本驗證等。
- 可擴展性
- 請求信息轉發
一般的功能都可以隨便添加。這里主要說一下消息轉發。對於客戶端和業務服務來說,網關是一個承上啟下的作用。首先客戶端與網關建立連接,第二,網關收到客戶端的一請求請,得知道把這條請求發送到哪個業務服務上面,第三,業務服務處理完一個請求,如何把消息返回給網關,網關再如何把消息發給客戶端。
一,客戶端與網關建立連接
網關作為一個單獨的對外服務,而且是長連接,一般使用Netty作為服務的網絡通信框架。它的異步高性能是公認的,這沒什么可說的。在游戲服務器的網關中,建立連接一般分為兩個步驟:
1,客戶端通過socket連接到服務器
2,連接的認證,防止無用的連接過多
連接到服務器之后,客戶端和服務器就會建立起一個socket通信通道,但是一個服務器的socket連接數量是有限的,如果客戶端與服務器大量建立socket連接,而不通信,就會造成大量的socket資源被占用,增加服務器的壓力,影響正常用戶的使用,所以要有連接的認證,當連接建立成功之后,要在一段時間之內進行認證,如何認證呢?就是讓用戶請求token驗證,如果一段時間內沒有認證,則服務器主動斷開連接。這樣也可以保證之后用戶的通信是有效的,不用每次都驗證token.用戶驗證成功之后,保證用戶id與連接的映射,方便根據用戶id給此用戶的客戶端返回消息。
二,網關與業務服務間的通信
一個網關后面可能有n個業務服務,所以是一個一對多的關系。所以增加一個業務服務都需要與網關建立一條連接。如果直接建立連接,管理起來比較麻煩。既然是一對多的關系,我們自然想到一種模式:發布-訂閱。這種模式可以解耦發布者和訂閱者。而目前很多消息隊列框架都支持這種模式。比如rabbitmq,rocketmq,kafka等。推薦使用rocketmq。這里阿里的消息中間件。
要實現網關和業務服務的數據交互,大消息傳輸中需要幾個公共參數:
fromServerId 消息的發送服務器id,即消息的來源服務id
toServerId 消息要到害的服務Id
在網關與業務服務交互的消息中必須帶有這兩個參數
1,網關收到的消息如何轉發到業務服務器
既然是使用發布-訂閱模式,那網關就是發布者,業務服務就是訂閱者,即消息消費者。在網關處,首先是根據用戶id選擇用戶到過的業務服務id,可以根據用戶id和業務服務數量求余,這樣同一個用戶id都會被分配到同一台業務服務器上面。為了可以保證動態添加新的服務,每次給用戶分配好到達的業務服務id之后,可以緩存起來,有緩存的話就使用緩存中的,這樣動態添加一台新的業務服務之后,已分配的用戶不用重新分配,當網關重啟之后清空緩存,再重新分配。獲得的業務服務id即toServerId,網關收到消息之后,發送消息的topic可以使用toServerId組合,例如:“GameGate” + toServerId ,這樣同一個業務服務的消息都會發送到同一個消息主題里面。而在業務服務端,則需要監聽網關的消息,監聽topic就是“GameGate” + 本業務服務的id,這樣就可以收到網關發送過來的消息了。
2,業務服務如何返回消息給網關
同樣的道理,業務服務要發消息給網關,那么業務服務就是發送者,發送的消息topic可以是“GameServer” + 網關服務的id,即從接收消息中獲取的fromServerId。而網關那邊則需要監聽topic:"GameServer" + 本網關的服務Id.
這樣就完成了網關和業務服務之間的消息交互。網關的其它職能可以根據需要增加。
QQ群交流:66728073,更多文章:http://www.coc88.com;公眾號: