Netty:資料處理流程,netty資料處理流程
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了。