1. 程式人生 > >leaf原始碼分析(三)----gate和network

leaf原始碼分析(三)----gate和network

Leaf 是一個由 Go 語言(golang)編寫的開發效率和執行效率並重的開源遊戲伺服器框架。Leaf 適用於各類遊戲伺服器的開發,包括 H5(HTML5)遊戲伺服器。

Gate 模組為Leaf提供接入功能。這個模組的功能很重要,是伺服器的入口。它能同時監聽TcpSocket和WebSocket。主要流程是在接入連線的時候建立一個Agent,並將這個Agent通知給AgentRpc。其核心其實是一個TcpServer和WebScoketServer,他的協議函式能夠將socket位元組流分包,封裝為Msg傳遞給Agent。其工作流可以檢視Server模組。

那麼gate,network,skeleton的主要用法關係如下


skeleton的用法已經講解過了

下面先講講gate、network各個模組

tcp msg

github.com/name5566/leaf/network/tcp_msg.go

msg是對資料的封裝

MsgParser


len + data模式

lenMsgLen    int                    len的位元組長度
minMsgLen    uint32              最小msg長度
maxMsgLen    uint32             最大msg長度
littleEndian
bool                    大小端

NewMsgParser


以上是初始化值。

SetMsgLen


以上提供了修改msg len的引數。建議不做修改

SetByteOrder


提供了,設定大小端的介面

Read


函式裡面的註釋很清晰。

1、read len:根據協議讀取len大小的位元組

2、parse len:根據大小端不同,解析len

3、check len:檢查len大小,是不是在min和max之間

4、data:讀取len大小的資料。

Write


函式的註釋很清晰

1、get len:獲取msg len

2、check len:判斷len是否是在min和max之間

3、根據len和data大小,申請msg buf

4、write len:根據大小端不同寫入len

5、write data:將data寫入到msg buf中

6、最後將msg傳送出去

小結:

msg是一個很簡單的協議封裝,len+data模式。讀寫函式功能,是標準的寫法。

tcp conn

先看下Conn介面

github.com/name5566/leaf/network/conn.go


github.com/name5566/leaf/network/tcp_conn.go

tcp conn是連線的一個封裝

這裡面用chan來進行寫操作的封裝


除了write的處理上需要講解下,read則和常規類似

TCPConn


其中最重要的是writeChan,msgParser

newTCPConn


1、初始化。其中注意下writechan中的pendingWriteNum,chan的容量

2、開啟了一個協程,用於寫。 這裡的協程是重點

     從writechan中,不停的接收資料,然後將其傳送出去。

    當writechan close後,則退出。

Write


tcp msg中,已經分析過了,msgparser的write將資訊按照協議封裝後,則會呼叫conn的write


這裡呼叫了doWrite


這裡面,將要傳送的資料,傳送到writechan中

Read


msgparser的Read需要呼叫conn的Read


close

tcp server

github.com/name5566/leaf/network/tcp_server.go

tcp server


以上結構中,重要的東西

1、Agent:agent是封裝conn和processor的角色。後面會重點講

2、msg parser:這個已經講解過了。

其餘的都是常規的用法

Start


啟動介面,init和run

init


主要工作

1、建立tcp監聽

2、初始化msg parser

run


1、accept連線

2、連線判斷是否超過上限。

3、將conn放入conns中,用於後期close的處理

4、重點,將conn和msgparser封裝到tcpconn中

5、將tcpconn生成agent

6、agent run。重點是在agent中處理的。這裡要記住

processor

github.com/name5566/leaf/network/processor.go

processor是邏輯處理的重要環節


processor中主要的目的就是路由和序列化和反序列化處理

這裡用json來講解

github.com/name5566/leaf/network/json/json.go

processor


processor中儲存了一系列的msginfo

MsgInfo


其中最重要的是msgRouter。

msgHandler和msgRawHandler基本上不推薦使用。但也是給使用者留有更靈活的處理模式。

Register


註冊msg型別,這裡程式碼很清晰

SetRouter


1、先查詢到對應的msg,這個需要先註冊,否則是非法的。

2、對應的路由設定。其實就是設定chanrpc。

     chanrpc的用法,已經講解過了。

route


1、raw資訊的處理。這裡面需要先SetRawHandler。但不推薦這種用法。

     一般情況下raw是沒有設定的

2、然後查詢msg型別

3、msghandler處理。這裡面需要先設定SetHandler。但也不推薦這種用法。

     一般情況下handler是沒有設定的

4、最後,會執行chanrpc中的Go。這裡是連線chanrpc的部分

unmarshal marshal

gate

github.com/name5566/leaf/gate/gate.go

gate雖然非常重要,但其程式碼確很少。主要是一個組織角色

Gate


裡面很重要的部分,processor講解過了,chanrpc也講解過了,network也講解過了。看看這些是怎麼組織起來的

Run


其中程式碼省略了wsServer程式碼。

其中最重要的部分是,向tcpserver提供了一個NewAgent函式。

隨後就是tcpserver start。

agent

github.com/name5566/leaf/gate/agent.go

agent介面


github.com/name5566/leaf/gate/gate.go


agent裡面包含了conn和gate資訊


最主要的流程在這裡

1、agent中,封裝的conn,也就是tcp conn,來ReadMsg。

          ReadMsg會通過tcp msg來讀取資訊。

2、processor來進行反序列化

3、processor來進行路由處理,其實是chanrpc中的Go,將要處理的方法,引數,傳送給了chanrpc。

總結

gate中,各個模組的職責都很清晰,一個模組只做自己的工作。要了解其過程,就需要先了解各個模組的職責。然後將其串起來。

龔浩華

月牙寂道長

QQ 29185807

2018年04月19日

如果你覺得本文對你有幫助,可以轉發分享到你的朋友圈,讓更多人一起學習。

第一時間獲取文章,可以關注本人公眾號:月牙寂道長,也可以掃碼關注


最後感謝關注本人公眾號。
如果想檢視歷史文章,可以點選公眾號下方的按鈕“歷史文章”
或者點選公眾號下方按鈕“文章目錄”獲取所有文章的索引檔案