Netty作為非同步的、事件驅動一個網路通信框架,使用它可以幫助我們快速開發高性能高可靠性的網路服務。 為了更好的使用Netty來解決開發中的問題,學習Netty是很有必要的。 Netty現在主流有三個版本:Netty3、Netty4、Netty5。這三個版本中,變化最大的要數線程模型了,各版本的線程 ...
Netty作為非同步的、事件驅動一個網路通信框架,使用它可以幫助我們快速開發高性能高可靠性的網路服務。
為了更好的使用Netty來解決開發中的問題,學習Netty是很有必要的。
Netty現在主流有三個版本:Netty3、Netty4、Netty5。這三個版本中,變化最大的要數線程模型了,各版本的線程模型均不相同。但是有一點是變化不大的,那就是Channel模型,因而數據處理流程也不會有太大的變化。所以本篇就來說一下Netty的數據處理流程,各版本的線程模型會後續說明。
Channel 模型
關於Netty Channel的模型,做了一個簡易圖:
一個Channel中包括一個Socket、一個ChannelPipeline。一個ChannelPipeline中有一個ChannelSink和多個ChannelHandler。ChannelHandler分為兩種:UpstremHandler、DownstreamHandler。
不論是讀數據還是寫數據都要經過Channel中的ChannelPipeline。讀數據的過程是從Socket到ChannelPipeline,由ChannelPipeline交給裡面的UpstreamHandler(或者叫做InBoundHandler)從下到上依次處理 。寫數據時,由要經過ChannelPipeline裡面在DownStreamHandler(或者是OutBoundHandler)由上到下依次處理。
Channel的創建
Channel主要分為兩種:ServerSocketChannel、SocketSocketChannel。這裡不對是否是NIO作區分。
ServerSocketChannel的創建在bind時自動完成,SocketChannel的創建由Netty幫助完成。不論是客戶端在創建連接時, 還是服務端接收到客戶端連接時,SocketChannel的創建都是由Netty幫助完成
在創建Channel時,就會自動調用相應的ChannelPipeline創建器來創建了。在創建ChannelPipeline時,可以由用戶配置相關的ChannelHandler。ServerSocketChannel可以由用戶定製一個ChannelHandler,SocketChannel則可以由用戶定製多個ChannelHandler。
在各版本中用於定製的方法可能是不同的。
ChannelSink
這個組件主要見於V3中
ChannelSink的有2個作用:
1、當出現異常時,通過exceptionCaught向沿著Pipeline上傳遞ExceptionEvent,(channel.getPipeline().sendUpsteam(new DefaultExceptionEv ent(channel,ex)));
2、當一個Message或者一個Events沿著Pipeline從上到下執行完所有的ChannelHandler處理後,進入ChannelSink的eventSunk方法。
下麵就說一下Server端、Client端的Sink的作用:
ServerSocketPipelineSink eventSunk:
- 當創建ServerSocket時,提交Boss任務。
- 當接收到Socket時,創建SocketChannel,並將一個Worker任務交給Worker Executor。
ClientSocketPipelineSink eventSunk:
1)當在Pipeline上流轉的是ChannelEvent時:
·如果是創建連接的event,將一個worker任務交給worker executor
·如果是興趣event,則註冊興趣事件。
2)當在Pipeline上流轉的是message時:
將要寫的數據放到寫隊列中,然後調用NioWorker的writeFromUserCode方法。
ChannelHandler
Netty是由事件驅動的框架,任何操作操作都是由事件來驅動的。
ChannelHandler就是一個Event Hander(事件處理器),它的作用是:
·處理IO事件(讀寫),例如讀取數據,並解碼。
·處理興趣事件。
·交給下一個ChannelHandler處理。
寫數據有兩種方式可以觸發
上述呢,簡單了說了一下Channel中各組件的作用以及處理流程,知道這些東西,已經可以幫助我們理解並使用Netty了。