前面簡單的介紹了Java I/O 和NIO,寫了示例程序。
Java I/O是阻塞的,為了讓它支持多個并發(fā),就要針對每個鏈接啟動線程,這種方式的結果就是在海量鏈接的情況下,會創(chuàng)建海量的線程,就算用線程池去緩解,也是治標不治本。所以,Java I/O 不適合高并發(fā)高性能的網絡編程需求。
NIO的出現(xiàn)就是為了解決這個問題,NIO中一個線程可以關注多個鏈接,解決了線程問題,前面也演示了如何用NIO編程。大家可以看到使用NIO是非常復雜的,可以說是陷阱重重,不是在網絡編程方面很資深的程序員,很難用NIO編寫出正常的程序,甚至高級程序員也不推薦用。
netty介紹
寫程序比較開心的就是碰到這種情況,一定會有很多框架去解決各種問題,比如JDBC直接寫很復雜,就會有hibernate和mybatis等框架,讓開發(fā)變得簡單。NIO編程也是一樣,出現(xiàn)過很多框架,相信很多人聽說過mina框架,和netty是同一個作者。而netty是目前最流行的解決NIO編程問題的框架。我們打開netty的官網,https://netty.io,首頁最上面就是netty的介紹:

翻譯成中文就是:
Netty是一個提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網絡服務器和客戶端程序。
用NIO也能開發(fā)這樣的程序,但是很復雜,如果用netty,就能很簡單很快速的開發(fā)高性能高可靠的程序,首頁上的圖片就是netty的框架架構:

我們在介紹Linux IO模型的時候也簡單看過。netty分成三大部分,一個是核心部分(Core),一個是傳輸服務部分(Transport Services),還有一個部分提供協(xié)議支持(Protocol Support)。我們前面介紹過NIO的buffer,而netty的核心部分有netty自定定義的一套Byte Buffer,就是圖中的Zero-Copy-Capable Rich Byte Buffer,NIO的buffer比較復雜,讀寫模式還要手動切換,不容易理解,netty的Byte Buffer要好很多。
核心部分還定義了一套通用的通信API(Universal Communication API),無論程序走tcp協(xié)議,還是udp協(xié)議,還是其它,都是通過統(tǒng)一的API通訊的。
核心部分還提供了一個可擴展的事件模型(Extensible Event Model),是基于事件的。這三部分共同構成了netty的核心部分。
在協(xié)議支持部分,提供了常用的通信協(xié)議的支持,比如http,tcp等等。除了通信協(xié)議,還提供了常用的編碼解碼協(xié)議的支持。在傳輸服務部分,提供了常見的傳輸服務的支持。根據圖片上的可以看出。
netty特性
netty的特性在官方網站的首頁列舉了出來,是英文的,我們來翻譯一下:
在設計方面來說:
1)統(tǒng)一的API,適用于不同的協(xié)議(阻塞和非阻塞)
2)基于靈活、可擴展的事件驅動模型(SEDA)
3)高度可定制的線程模型
4)可靠的無連接數據Socket支持(UDP)
在性能方面:
1)更好的吞吐量,低延遲
2)更省資源
3)盡量減少不必要的內存拷貝(這也是快的原因之一)
安全方面:
完整的SSL/TLS和STARTTLS的支持
在易用性方面:
1)完善的Java doc,用戶指南和樣例(個人覺得并不是很完善,國內的書籍也只有一兩本還可以)
2)僅依賴于JDK1.6(netty 4.x)
netty是個很流行的框架,在很多分布式框架和大數據框架都有用到,國內外的很多大公司也都在用(比如國內BAT等等),感興趣可以查詢一下,這里不再舉例子。netty是一個框架,從學習netty的過程中,我們也可以學到很多編程的技巧,netty的代碼也值得我們去讀一讀,能從里面學到很多東西。