1. 程式人生 > >Netty原理

Netty原理

什麽 數據傳輸 什麽事 高性能 align 還需 讀寫 實現類 異步

Netty是一個高性能、異步事件驅動的NIO框架,基於JAVA NIO提供的API實現

  • ChannelEvent

先說這個ChannelEvent,因為Netty是基於事件驅動的,就是我們上文提到的,發生什麽事,就通知"有關部門"。所以,不難理解,我們自己的業務代碼中,一定有跟這些事件相關的處理。在樣例代碼,我們處理的事件,就是channelConnected。以後,我們還會處理更多的事件。

  • ChannelPipeline

Pipeline,翻譯成中文的意思是:管道,傳輸途徑。也就是說,在這裏他是控制ChannelEvent事件分發和傳遞的。事件在管道中流轉,第一站到哪,第二站到哪,到哪是終點,就是用這個ChannelPipeline 處理的。比如:開發事件。先給A設計,然後給B開發。一個流轉圖,希望能給你更直觀的感覺。

  • ChannelHandler

剛說Pipeline負責把事件分發到相應的站點,那個這個站點在Netty裏,就是指ChannelHandler。事件到了ChannelHandler這裏,就要被具體的進行處理了,我們的樣例代碼裏,實現的就是這樣一個處理事件的“站點”,也就是說,你自己的業務邏輯一般都是從這裏開始的。

  • Channel

有了個部門的協調處理,我們還需要一個從整體把握形勢的,所謂“大局觀”的部門,channel。

channel,能夠告訴你當前通道的狀態,是連同還是關閉。獲取通道相關的配置信息。得到Pipeline等。是一些全局的信息。Channel自然是由ChannelFactory產生的。Channel的實現類型,決定了你這個通道是同步的還是異步的(nio)。例如,我們樣例裏用的是NioServerSocketChannel。

  • ChannelFuture

異步結果,這個是異步事件處理的關鍵,當一個事件被處理時,可以直接以ChannelFuture的形式直接返回,不用在當前操作中被阻塞。可以通過 ChannelFuture得到最終的執行結果,具體的做法是在ChannelFuture添加監聽器listener,當操作最終被執行完 後,listener會被觸發,我們可以在listener的回調函數中預定義我們的業務代碼。

技術分享圖片

技術分享圖片

阻塞IO的通信方式

                          技術分享圖片

非阻塞IO的通信方式

                                        技術分享圖片

Channel一覽

  • · Channel:數據傳輸流,與channel相關的概念有以下四個,上一張圖讓你了解netty裏面的Channel。
  • Channel,表示一個連接,可以理解為每一個請求,就是一個Channel。
  • ChannelHandler,核心處理業務就在這裏,用於處理業務請求。
  • ChannelHandlerContext,用於傳輸業務數據。
  • ChannelPipeline,用於保存處理過程需要用到的ChannelHandler和ChannelHandlerContext。
    • ByteBuf
      ByteBuf是一個存儲字節的容器,最大特點就是使用方便,它既有自己的讀索引和寫索引,方便你對整段字節緩存進行讀寫,也支持get/set,方便你對其中每一個字節進行讀寫,他的數據結構如下圖所示:

技術分享圖片

Netty原理