儘管JDK提供了豐富的NIO類庫,網上也有不少NIO學習例程,可是直接使用Java NIO類庫想要開發出穩定可靠的通訊框架卻並不是易事,緣由以下:
1)NIO的類庫和API繁雜,使用麻煩,你須要熟練掌握 Selector、Server Socket Channel
SocketChannel、ByteBuffer等。
2) 須要具有其餘的額外技能作鋪墊,例如熟悉Java多線程編程。這是由於NIO編程涉及到 Reactor模式,你必須對多線程和網路編程很是熟悉,才能編寫出高質量的NIO程序。
3)可靠性能力補齊,工做量和難度都很是大。例如客戶端面臨斷連重連、網絡閃斷、半包讀寫、失敗緩存、網絡擁塞和異常碼流的處理等問題,NIO編程的特色是功能開發相對容易,可是可靠性能力補齊的工做量和難度都很是大。
4) JDK NIO的BUG,例如臭名昭著的epoll bug,它會致使Selector空輪詢,最終致使CPU100% 。官方聲稱在JDK16版本的 updateI8修復了該問題,可是直到JDK1.7版本該問題仍舊存在,只不過該BUG發生機率下降了一些而已,它並無被根本解決。該BUG以及與該BUG相關的問題單能夠參見如下連接內容:
http://bugsjava.com/bugdatabase/viewbug.do?bugid=6403933
http:/bugs.javacom/bugdatabase/viewbugdo?bugid=2147719
隨着開源NO框架的發展,目前愈來愈多的商用系統採起直接集成開源NO框架的方式代替以前的自研方案。以最成熟的NIO框架Netty爲例,它已經獲得成百上千的商用項目驗證。例如 Hadoop的RPC框架avro使用Netty做爲底層通訊框架、實時流式計算框架Sum底層通訊框架也採用的是Netty,還有 Twitter內部使用的RPC框架 Finagle,其底層通訊框架也基於Netty構建。
java
◎API使用簡單,開發門檻低。
◎功能強大,預置了多種編解碼功能,支持多種主流協議。
◎定製能力強,能夠經過 ChannelHandler對通訊框架進行靈活地擴展。
◎性能高,經過與其餘業界主流的NO框架對比,Netty的綜合性能最優。
◎成熟、穩定,Nety修復了已經發現的全部 JDK NIO BUG,業務開發人員不須要再爲N1O的BUG而煩惱。
◎社區活躍,版本迭代週期短,發現的BUG能夠被及時修復。同時,更多的新功能會加入。
◎經歷了大規模的商業應用考驗,質量獲得驗證。在互聯網、大數據、網絡遊戲、企業應用、電信軟件等衆多行業獲得成功商用,證實了它已經徹底可以知足不一樣行業的商業應用了。
Netty的表現如此優秀,所以咱們的通訊框架基於Netty進行設計和開發。編程