本文基于Netty4.1展開介紹相關理論模型,使用場景,基本組件、整體架構
Netty簡介
Netty是 一個異步事件驅動的網絡應用程序框架,用于快速開發可維護的高性能協議服務器和客戶端。
JDK原生NIO程序的問題
JDK原生也有一套網絡應用程序API,但是存在一系列問題,主要如下:
- NIO的類庫和API繁雜,使用麻煩,你需要熟練掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等
- 需要具備其它的額外技能做鋪墊,例如熟悉Java多線程編程,因為NIO編程涉及到Reactor模式,你必須對多線程和網路編程非常熟悉,才能編寫出高質量的NIO程序
- 可靠性能力補齊,開發工作量和難度都非常大。例如客戶端面臨斷連重連、網絡閃斷、半包讀寫、失敗緩存、網絡擁塞和異常碼流的處理等等,NIO編程的特點是功能開發相對容易,但是可靠性能力補齊工作量和難度都非常大
- JDK NIO的BUG,例如臭名昭著的epoll bug,它會導致Selector空輪詢,最終導致CPU 100%。官方聲稱在JDK1.6版本的update18修復了該問題,但是直到JDK1.7版本該問題仍舊存在,只不過該bug發生概率降低了一些而已,它并沒有被根本解決
Netty的特點
Netty的對JDK自帶的NIO的API進行封裝,解決上述問題,主要特點有:
- 設計優雅
適用于各種傳輸類型的統一API - 阻塞和非阻塞Socket
基于靈活且可擴展的事件模型,可以清晰地分離關注點
高度可定制的線程模型 - 單線程,一個或多個線程池
真正的無連接數據報套接字支持(自3.1起)- 使用方便
詳細記錄的Javadoc,用戶指南和示例
沒有其他依賴項,JDK 5(Netty 3.x)或6(Netty 4.x)就足夠了- 高性能
吞吐量更高,延遲更低
減少資源消耗
最小化不必要的內存復制- 安全
完整的SSL / TLS和StartTLS支持- 社區活躍,不斷更新
社區活躍,版本迭代周期短,發現的BUG可以被及時修復,同時,更多的新功能會被加入
Netty常見使用場景
- 互聯網行業
在分布式系統中,各個節點之間需要遠程服務調用,高性能的RPC框架必不可少,Netty作為異步高新能的通信框架,往往作為基礎通信組件被這些RPC框架使用。
典型的應用有:阿里分布式服務框架Dubbo的RPC框架使用Dubbo協議進行節點間通信,Dubbo協議默認使用Netty作為基礎通信組件,用于實現各進程節點之間的內部通信。
- 游戲行業
無論是手游服務端還是大型的網絡游戲,Java語言得到了越來越廣泛的應用。Netty作為高性能的基礎通信組件,它本身提供了TCP/UDP和HTTP協議棧。
非常方便定制和開發私有協議棧,賬號登錄服務器,地圖服務器之間可以方便的通過Netty進行高性能的通信
- 大數據領域
經典的Hadoop的高性能通信和序列化組件Avro的RPC框架,默認采用Netty進行跨界點通信,它的Netty Service基于Netty框架二次封裝實現
技術討論 & 疑問建議 & 個人博客
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協議,轉載請注明出處!