1. Netty介紹 java
Netty是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端,Netty是基於NIO實現的,因此整個Netty都是異步操做,網絡應用程序一般須要有較高的可擴展性,不管是Netty仍是其餘的基於Java NIO的框架,都會提供可擴展性的解決方案。編程
2. 爲何使用Netty?安全
Netty是業界最流行的NIO框架之一,它的健壯性、功能、性能、可定製性和可擴展性在同類框架中都是數一數二的,它已經獲得成百上千的商用項目驗證,例如Hadoop的RPC框架,avro使用Netty做爲底層通訊框架。不少其它業界主流的RPC框架,也使用Netty來構建高性能的異步通訊能力。
經過對Netty的分析,咱們將它的優勢總結以下:
1) API使用簡單;
2) 功能強大,預置了多種編解碼功能,支持多種主流協議;
3) 定製能力強,能夠經過ChannelHandler對通訊框架進行靈活的擴展;
4) 性能高,經過與其它業界主流的NIO框架對比,Netty的綜合性能最優;
5) 成熟、穩定,Netty修復了已經發現的全部JDK NIO BUG,業務開發人員不須要再爲NIO的BUG而煩惱;
3. Netty的功能很是豐富服務器
Netty的包結構以下網絡
在這裏面,channel
和handler
兩部分比較複雜。咱們不妨與Netty官方的結構圖對照一下,來了解其功能。框架
org.jboss.netty.buffer
包中。org.jboss.netty.channel.Channel
)來封裝這兩種I/O模型。這部分代碼在org.jboss.netty.channel
包中。4. Netty的特性總結異步
分 類ide |
Netty的特性oop |
---|---|
設計性能 |
統一的API,支持多種傳輸類型,阻塞的和非阻塞的簡單而強大的線程模型真正的無鏈接數據報套接字支持連接邏輯組件以支持複用 |
易於使用 |
詳實的Javadoc和大量的示例集不須要超過JDK 1.6的依賴。(一些可選的特性可能須要Java 1.7+和/或額外的依賴) |
性能 |
擁有比Java的核心API更高的吞吐量以及更低的延遲得益於池化和複用,擁有更低的資源消耗最少的內存複製 |
健壯性 |
不會由於慢速、快速或者超載的鏈接而致使OutOfMemoryError消除在高速網絡中NIO應用程序常見的不公平讀/寫比率 |
安全性 |
完整的SSL/TLS以及StartTLS支持可用於受限環境下,如Applet和OSGI |
社區驅動 |
發佈快速並且頻繁 |
5. Netty的核心組件
Netty的主要構件塊:
Channel
;Future
;ChannelHandler
。這些構建塊表明了不一樣類型的構造:資源、邏輯以及通知。你的應用程序將使用它們來訪問網絡以及流經網絡的數據。
對於每一個組件來講,咱們都將提供一個基本的定義,而且在適當的狀況下,還會提供一個簡單的示例代碼來講明它的用法。
Channel是Java NIO的一個基本構造。它表明一個到實體(如一個硬件設備、一個文件、一個網絡套接字或者一個可以執行一個或者多個不一樣的I/O操做的程序組件)的開放鏈接,如讀操做和寫操做,目前,能夠把Channel
看做是傳入(入站)或者傳出(出站)數據的載體。所以,它能夠被打開或者被關閉,鏈接或者斷開鏈接。
一個回調其實就是一個方法,一個指向已經被提供給另一個方法的方法的引用。這使得後者能夠在適當的時候調用前者。回調在普遍的編程場景中都有應用,並且也是在操做完成後通知相關方最多見的方式之一。
Netty在內部使用了回調來處理事件;當一個回調被觸發時,相關的事件能夠被一個interface-ChannelHandler
的實現處理。
代碼清單1-2展現了一個例子:
1) 當一個新的鏈接已經被創建時,ChannelHandler
的channelActive()
回調方法將會被調用,並將打印出一條信息。
2) 被回調觸發的ChannelHandler
public class ConnectHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { -- 當一個新的鏈接已經被創建時,channelActive(ChannelHandlerContext)將會被調用 System.out.println( "Client " + ctx.channel().remoteAddress() + " connected"); } }
1) Future提供了另外一種在操做完成時通知應用程序的方式。這個對象能夠看做是一個異步操做的結果的佔位符;它將在將來的某個時刻完成,並提供對其結果的訪問。
2) JDK預置了interface java.util.concurrent.Future,可是其所提供的實現,只容許手動檢查對應的操做是否已經完成,或者一直阻塞直到它完成。這是很是繁瑣的,因此Netty提供了它本身的實現——ChannelFuture,用於在執行異步操做的時候使用。
3) ChannelFuture提供了幾種額外的方法,這些方法使得咱們可以註冊一個或者多個ChannelFutureListener實例。監聽器的回調方法operationComplete(),將會在對應的操做完成時被調用。而後監聽器能夠判斷該操做是成功地完成了仍是出錯了。若是是後者,咱們能夠檢索產生的Throwable。簡而言之,由ChannelFutureListener提供的通知機制消除了手動檢查對應的操做是否完成的必要。
4) 每一個Netty的出站I/O操做都將返回一個ChannelFuture
;也就是說,它們都不會阻塞。正如咱們前面所提到過的同樣,Netty徹底是異步和事件驅動的。
5.4 事件和ChannelHandler
Netty使用不一樣的事件來通知咱們狀態的改變或者是操做的狀態。這使得咱們可以基於已經發生的事件來觸發適當的動做。這些動做多是:
Netty是一個網絡編程框架,因此事件是按照它們與入站或出站數據流的相關性進行分類的。可能由入站數據或者相關的狀態更改而觸發的事件包括:
出站事件是將來將會觸發的某個動做的操做結果,這些動做包括:
每一個事件均可以被分發給ChannelHandler
類中的某個用戶實現的方法。這是一個很好的將事件驅動範式直接轉換爲應用程序構件塊的例子。圖展現了一個事件是如何被一個這樣的ChannelHandler
鏈處理的。
Netty提供了大量預約義的能夠開箱即用的ChannelHandler
實現,包括用於各類協議(如HTTP和SSL/TLS)的ChannelHandler
。在內部,ChannelHandler
本身也使用了事件和Future
,使得它們也成爲了你的應用程序將使用的相同抽象的消費者。