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長度
littleEndianbool 大小端
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日
如果你覺得本文對你有幫助,可以轉發分享到你的朋友圈,讓更多人一起學習。
第一時間獲取文章,可以關注本人公眾號:月牙寂道長,也可以掃碼關注
最後感謝關注本人公眾號。
如果想檢視歷史文章,可以點選公眾號下方的按鈕“歷史文章”
或者點選公眾號下方按鈕“文章目錄”獲取所有文章的索引檔案