什麼是Netty
Netty是一款開源的網絡通訊框架,它是異步的、基於事件的,且高性能的框架,它支持多種網絡協議,例如HTTP,websocket,TCP/IP、UDP、FTP等等,所有網絡通訊問題都能由Netty解決
Netty線程模型
Netty核心組件
EventLoopGroup
概述:這是一個事件循環組,這個組內可以有一個或多個EventLoop,一個BossGroup和WorkerGroup都是EventLoopGroup的實現,通常BossGroup處理客戶端連接,然後把連接後的客戶通道交給WorkerGroup進行IO處理
EventLoop
概述:這個是一個事件循環,在這個事件循環裏面有一個selector和一個taskQueue,而selector裏維護着多個管道
Pipeline
概述: 管道和Pipeline是一對一的關聯關係,而pipeline內部的多個Context形成了鏈表,Context只是對Handler的封裝,當有事件發生數據通過通道流入管道,經過一個又一個的處理器
Netty自帶的Handler
概述:Netty自帶了一些Handler(處理器),這些處理器通常用於正式處理業務前後的編碼、解碼
HTTP相關Handler
-
HttpRequestDecoder:該處理器是把HTTP請求解碼,然後將解碼後數據封裝到HttpObject(默認DefaultHttpRequest實現)內後傳給下一個Handler,這是一個InBound處理器
-
HttpResponseEncoder:該處理器是把HTTP響應編碼爲瀏覽器可讀的數據的處理器,這是一個OutBound處理器
-
HttpServerCodec:該處理器相當於HttpRequestDecoder+ HttpResponseEncoder,通常用於服務器上
-
HttpResponseDecoder:該處理器是把HTTP響應解碼爲一個HttpObject(默認DefaultHttpResponse實現)對象後傳給下一個Handler,這是一個InBound處理器
-
HttpRequestEncoder:該處理器是把HTTP請求編碼爲可發送的HTTP請求數據,這是一個OutBound處理器
-
HttpClientCodec:該處理器相當於HttpResponseDecoder+ HttpRequestEncoder,通常用於客戶端上
ChannelHandler的調用/註冊順序
概述:在管道中有一個管道處理器鏈,這個鏈是有序的,根據註冊的順序來調用管道內的處理器
註冊順序:
註冊順序從鏈頭到鏈尾爲:解碼器(入棧)->編碼器(出棧)->業務處理器(入/出棧)
注意:如果出棧處理器被註冊在處理器鏈的尾部,那麼這個出棧處理器可能達不到預期的效果,所以一般註冊在業務處理器的前面
調用順序:
處理器的調用順序爲:
鏈頭入棧處理器1入棧處理器2入棧處理器n鏈尾出棧處理器n出棧處理器n-1出棧處理器n-2…出棧處理器1鏈頭
注意:調用順序爲從鏈頭開始向鏈尾調用中間所有可調用的入棧處理器,然後再在鏈尾處逆向回來調用中間可用的所有出棧處理器,最到鏈頭結束