資料內(nèi)容:
3、JDK 原生 NIO 程序的問題
JDK 原生也有一套網(wǎng)絡(luò)應(yīng)用程序 API,但是存在一系列問題,主要如下:
1) NIO 的類庫和 API 繁雜,使用麻煩:你需要熟練掌握 Selector、ServerSocketChannel、
SocketChannel、ByteBuffer 等。
2) 需要具備其他的額外技能做鋪墊:例如熟悉 Java 多線程編程,因?yàn)?NIO 編程涉及到
Reactor 模式,你必須對多線程和網(wǎng)路編程非常熟悉,才能編寫出高質(zhì)量的 NIO 程序。
3) 可靠性能力補(bǔ)齊,開發(fā)工作量和難度都非常大:例如客戶端面臨斷連重連、網(wǎng)絡(luò)閃斷、
半包讀寫、失敗緩存、網(wǎng)絡(luò)擁塞和異常碼流的處理等等。NIO 編程的特點(diǎn)是功能開發(fā)相
對容易,但是可靠性能力補(bǔ)齊工作量和難度都非常大。
4) JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它會導(dǎo)致 Selector 空輪詢,最終導(dǎo)致 CPU
100%。官方聲稱在 JDK 1.6 版本的 update 18 修復(fù)了該問題,但是直到 JDK 1.7 版本該
問題仍舊存在,只不過該 Bug 發(fā)生概率降低了一些而已,它并沒有被根本解決。
4、Netty 的特點(diǎn)
Netty 對 JDK 自帶的 NIO 的 API 進(jìn)行了封裝,解決了上述問題。
Netty 的主要特點(diǎn)有:
1) 設(shè)計(jì)優(yōu)雅:適用于各種傳輸類型的統(tǒng)一 API 阻塞和非阻塞 Socket;基于靈活且可擴(kuò)展
的事件模型,可以清晰地分離關(guān)注點(diǎn);高度可定制的線程模型 - 單線程,一個(gè)或多個(gè)線
程池;真正的無連接數(shù)據(jù)報(bào)套接字支持(自 3.1 起)。
2) 使用方便:詳細(xì)記錄的 Javadoc,用戶指南和示例;沒有其他依賴項(xiàng),JDK 5(Netty 3.x)
或 6(Netty 4.x)就足夠了。
3) 高性能、吞吐量更高:延遲更低;減少資源消耗;最小化不必要的內(nèi)存復(fù)制。
4) 安全:完整的 SSL/TLS 和 StartTLS 支持。
5) 社區(qū)活躍、不斷更新:社區(qū)活躍,版本迭代周期短,發(fā)現(xiàn)的 Bug 可以被及時(shí)修復(fù),同時(shí),
更多的新功能會被加入。
5、Netty 常見使用場景
Netty 常見的使用場景如下:
1)互聯(lián)網(wǎng)行業(yè):在分布式系統(tǒng)中,各個(gè)節(jié)點(diǎn)之間需要遠(yuǎn)程服務(wù)調(diào)用,高性能的 RPC 框架必
不可少,Netty 作為異步高性能的通信框架,往往作為基礎(chǔ)通信組件被這些 RPC 框架使用。
典型的應(yīng)用有:阿里分布式服務(wù)框架 Dubbo 的 RPC 框架使用 Dubbo 協(xié)議進(jìn)行節(jié)點(diǎn)間通信,
Dubbo 協(xié)議默認(rèn)使用 Netty 作為基礎(chǔ)通信組件,用于實(shí)現(xiàn)各進(jìn)程節(jié)點(diǎn)之間的內(nèi)部通信。
2)游戲行業(yè):無論是手游服務(wù)端還是大型的網(wǎng)絡(luò)游戲,Java 語言得到了越來越廣泛的應(yīng)用。
Netty 作為高性能的基礎(chǔ)通信組件,它本身提供了 TCP/UDP 和 HTTP 協(xié)議棧。
非常方便定制和開發(fā)私有協(xié)議棧,賬號登錄服務(wù)器,地圖服務(wù)器之間可以方便的通過 Netty
進(jìn)行高性能的通信。
3)大數(shù)據(jù)領(lǐng)域:經(jīng)典的 Hadoop 的高性能通信和序列化組件 Avro 的 RPC 框架,默認(rèn)采用
Netty 進(jìn)行跨界點(diǎn)通信,它的 Netty Service 基于 Netty 框架二次封裝實(shí)現(xiàn)。
有興趣的讀者可以了解一下目前有哪些開源項(xiàng)目使用了 Netty 的 Related Projects。
6、Netty 高性能設(shè)計(jì)
Netty 作為異步事件驅(qū)動的網(wǎng)絡(luò),高性能之處主要來自于其 I/O 模型和線程處理模型,前者
決定如何收發(fā)數(shù)據(jù),后者決定如何處理數(shù)據(jù)。