Nettry--技術淺析
Nettry學習
1.Nettry入門簡介
Netty是JBoss出品的高效的Java NIO開發框架,是一個高效能、非同步事件驅動的NIO框架,它提供了對TCP、UDP和檔案傳輸的支援,作為一個非同步NIO框架,Netty的所有IO操作都是非同步非阻塞的,通俗的說:一個好使的處理Socket的框架。
主要作用:用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。
2.Nettry總體結構
主要元件:
Bootstrap or ServerBootstrap
EventLoop
EventLoopGroup
ChannelPipeline
Channel
Future or ChannelFuture
ChannelInitializer
ChannelHandler
Bootstrap
Handler: 為了支援各種協議和處理資料的方式,便誕生了Handler元件。Handler主要用來處理各種事件,這裡的事件很廣泛,比如可以是連線、資料接收、異常、資料轉換等。
ChannelInboundHandler:一個最常用的Handler。這個Handler的作用就是處理接收到資料時的事件,也就是說,我們的業務邏輯一般就是寫在這個Handler裡面的,ChannelInboundHandler就是用來處理我們的核心業務邏輯。
ChannelInitializer
ChannelPipeline :一個Netty應用基於ChannelPipeline機制,這種機制需要依賴於EventLoop和EventLoopGroup,因為它們三個都和事件或者事件處理相關。
EventLoops :的目的是為Channel處理IO操作,一個EventLoop可以為多個Channel服務。
EventLoopGroup
Channel :Channel代表了一個Socket連結,或者其它和IO操作相關的元件,它和EventLoop一起用來參與IO處理。
Future:在Netty中所有的IO操作都是非同步的,因此,你不能立刻得知訊息是否被正確處理,但是我們可以過一會等它執行完成或者直接註冊一個監聽,具體的實現就是通過Future和ChannelFutures,他們可以註冊一個監聽,當操作執行成功或失敗時監聽會自動觸發。總之,所有的操作都會返回一個ChannelFuture。
3.網路模型
Netty是典型的Reactor模型結構,
4.Nettry是如何實現連線和業務邏輯的?
Netty是一個非阻塞的、事件驅動的、網路程式設計框架。當然,我們很容易理解Netty會用執行緒來處理IO事件,對於熟悉多執行緒程式設計的人來說,你或許會想到如何同步你的程式碼,但是Netty不需要我們考慮這些,具體是這樣:
一個Channel會對應一個EventLoop,而一個EventLoop會對應著一個執行緒,也就是說,僅有一個執行緒在負責一個Channel的IO操作。
關於這些名詞之間的關係,可以見下圖:
如圖所示:當一個連線到達,Netty會註冊一個channel,然後EventLoopGroup會分配一個EventLoop繫結到這個channel,在這個channel的整個生命週期過程中,都會由繫結的這個EventLoop來為它服務,而這個EventLoop就是一個執行緒。
說到這裡,那麼EventLoops和EventLoopGroups關係是如何的呢?我們前面說過一個EventLoopGroup包含多個Eventloop,但是我們看一下下面這幅圖,這幅圖是一個繼承樹,從這幅圖中我們可以看出,EventLoop其實繼承自EventloopGroup,也就是說,在某些情況下,我們可以把一個EventLoopGroup當做一個EventLoop來用。
4.官方API
netty 官方API: http://netty.io/4.1/api/index.html