儘管JDK提供了豐富的NIO類庫,網上也有很多NIO學習例程,但是直接使用Java NIO類庫想要開發出穩定可靠的通訊框架卻並非易事,原因如下:
1)NIO的類庫和API繁雜,使用麻煩,你需要熟練掌握 Selector、Server Socket Channel
SocketChannel、ByteBuffer等。
- 需要具備其他的額外技能做鋪墊,例如熟悉Java多執行緒程式設計。這是因為NIO程式設計涉及到 Reactor模式,你必須對多執行緒和網路程式設計非常熟悉,才能編寫出高質量的NIO程式。
3)可靠效能力補齊,工作量和難度都非常大。例如客戶端面臨斷連重連、網路閃斷、半包讀寫、失敗快取、網路擁塞和異常碼流的處理等問題,NIO程式設計的特點是功能開發相對容易,但是可靠效能力補齊的工作量和難度都非常大。
- JDK NIO的BUG,例如臭名昭著的epoll bug,它會導致Selector空輪詢,最終導致CPU100% 。官方聲稱在JDK16版本的 updateI8修復了該問題,但是直到JDK1.7版本該問題仍舊存在,只不過該BUG發生概率降低了一些而已,它並沒有被根本解決。
隨著開源NO框架的發展,目前越來越多的商用系統採取直接整合開源NO框架的方式代替之前的自研方案。以最成熟的NIO框架Netty為例,它已經得到成百上千的商用專案驗證。例如 Hadoop的RPC框架avro使用Netty作為底層通訊框架、實時流式計算框架Sum底層通訊框架也採用的是Netty,還有 Twitter內部使用的RPC框架 Finagle,其底層通訊框架也基於Netty構建。
Netty的優勢總結如下:
◎API使用簡單,開發門檻低。
◎功能強大,預置了多種編解碼功能,支援多種主流協議。
◎定製能力強,可以通過 ChannelHandler對通訊框架進行靈活地擴充套件。
◎效能高,通過與其他業界主流的NO框架對比,Netty的綜合效能最優。
◎成熟、穩定,Nety修復了已經發現的所有 JDK NIO BUG,業務開發人員不需要再為N1O的BUG而煩惱。
◎社群活躍,版本迭代週期短,發現的BUG可以被及時修復。同時,更多的新功能會加入。
◎經歷了大規模的商業應用考驗,質量得到驗證。在網際網路、大資料、網路遊戲、企業應用、電信軟體等眾多行業得到成功商用,證明了它已經完全能夠滿足不同行業的商業應用了。