天天看點

深入淺出Netty之一概念模型

Netty是一個java領域常用的IO架構,小編最近簡單看了下它的實作,和大家分享下。小編能力有限,有不對的地方還請大家指出。這個系列将分多個文章來完成,第一篇先簡單介紹下netty的概念模型。使用的netty版本是3.5.11.Final。

Netty的核心概念可以用這個類圖來表示:

深入淺出Netty之一概念模型

一.Bootstrap

   netty架構啟動的工具類,分client,server和udp3種,其核心功能是初始化主channel

二.ChannelFactory

   建立Channel的工廠,接受ChannelPipeline參數,建立一個Channel。針對不同場景,netty提供了各種ChannelFactory,比如ServerChannelFactory用來建立server端的Channel,比如DatagramChannelFactory用來建立UDP的Channel

三.ChannelPipelineFactory

  建立ChannelPipeline的工廠,比如在server中接受一個請求(子channel)時,會使用ChannelPipelineFactory建立一個ChannelPipeline,并附給子channel。該類一般是使用者定義,是netty提供的擴充接口,基于此使用者可以自定義其事件處理流。

四.Channel

  Channel代表着一個通道,其封裝了各種IO操作,比如bind,connect等,Channel還管理着一些配置資訊,使用者可以自定義一些IO參數。同時Channel是可以繼承的,在server場景下,accept的channel會作為主channel的子channel存在。netty預設提供了各種Channel實作,包括OIO/NIO,udp/tcp,client/server等。Netty的channel是對java nio的封裝。

五.ChannelPipeline

  ChannelPipeline管理着一些列由使用者自定義的ChannelHandler,handler之間使用職責鍊組成。同時,它還提供了事件觸發的入口,這些事件将在handler之間按注冊順序執行。

六.ChannelHandler

  事件處理器,主要分2個子接口ChannelUpstreamHandler和ChannelDownstreamHandler,分别處理UpstreamEvent和DownstreamEvent。這是業務方直接可擴充的接口,業務邏輯基本都封裝在這裡。一個handler也可以同時處理2種類型的事件。

七.ChannelEvent

  事件,流轉方式分Upstream events和downstream events,類型分MessageEvent,ExceptionEvent,ChannelStateEvent,WriteCompletionEvent等。

 Upstream event主要有:messageReceived,exceptionCaught,channelOpen,channelClosed,channelBound,channelUnbound,channelConnected,writeComplete,channelDisconnected,channelInterestChanged,childChannelOpen,childChannelClosed等。

Downstream event主要有:write,bind,unbind,connect,disconnect,close等。

八.ChannelSink

  Downstream事件的最終處理者,所有downstream事件交給netty線程前都會被其處理。它是管理IO線程和事件處理的橋梁。同樣針對不同的場景,netty提供了各種實作。

以上是netty的核心模型,事件流轉如下圖

深入淺出Netty之一概念模型

 Upstream事件隻會交給Upstream handler處理,downstream同理。