1. Netty基礎知識
1.1 Netty出現的原因
- Java NIO 太難用,存在BUG(如Epoll-Bug)
- 基於第一點,大多數高性能服務器被C和C++盤踞
- 同樣基於第一點,Java NIO編程門檻高
- 業界其他的NIO框架不成熟
1.2 Netty
Netty是由JBOSS提供的一個Java開源框架。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。
也就是說,Netty 是一個基於NIO的客戶、服務器端編程框架,使用Netty 可以確保你快速和簡單的開發出一個網絡應用,例如實現了某種協議的客戶,服務端應用。Netty相當簡化和流線化了網絡應用的編程開發過程,例如,TCP和UDP的socket服務開發。
“快速”和“簡單”並不意味着會讓你的最終應用產生維護性或性能上的問題。Netty 是一個吸收了多種協議的實現經驗,這些協議包括FTP,SMTP,HTTP,各種二進制,文本協議,並經過相當精心設計的項目,最終,Netty 成功的找到了一種方式,在保證易於開發的同時還保證了其應用的性能,穩定性和伸縮性.
1.3 特性
1.3.1 設計
- 統一的API,適用於不同的協議(阻塞和非阻塞)
- 基於靈活、可擴展的事件驅動模型
- 高度可定制的線程模型
- 可靠的無連接數據Socket支持(UDP)
1.3.2 性能
- 更好的吞吐量,低延遲
- 更省資源
- 盡量減少不必要的內存拷貝
1.3.3 安全
- 完整的SSL/TLS和STARTTLS的支持
- 能在Applet與Android的限制環境運行良好
1.3.4 健壯
- 不再因過快、過慢或超負載連接導致OutOfMemoryError
- 不再有在高速網絡環境下NIO讀寫頻率不一致的問題
1.3.5 易用
- 完善的JavaDoc,用戶指南和樣例
- 簡潔簡單
- 僅依賴標准JDK
1.4 與其他框架的比較
1.4.1 Mina
Mina是有apache開發的幫助用戶開發高性能和高伸縮網絡應用程序的框架。它通過Java nio技術基於TCP/IP和UDP/IP協議提供了抽象的、事件驅動的、異步的API。
Netty與Mina的比較:
- Netty和Mina的主導作者是同一人
- Mina出自於Apache,Netty出身於商業開源大亨Jboss
- Mina和Netty都采用了Reactors in threads模型
- Mina是heapbytebuffer,Netty是directbytebuffer
- 調度任務的不同
- Mina和內核結合更緊密
- Netty開發比Mina開發更靈活,更友好
2. 架構簡介
2.1 架構分析
2.1.1 總體結構
2.1.1.1 Core
Netty Core是Netty核心內容,它包括事件模型、通用API和Zero Copy功能。是上層功能的基礎,由Core可以構建不同的應用服務。
2.1.1.2 Protocl Support
Protocol Support提供了多種協議的編解碼包括HTTP、二進制和Google Protobuf等等,它們通過Codec Framework進行整合。
2.1.1.3 Transport Support
Transport Support提供了基本的NIO和BIO傳輸實現,是Netty網絡通信的基礎。
2.1.1.4 Security Support
Security Support不光提供了通信層的安全保障(比如SSL/TLS),還在應用層提供了解決OOM的方案。
2.1.1.5 Container Integration
Container Integration是可以應用於其他主流開發框架的集合,通過它可以和Spring、OSGi進行快速集成,為快速使用Netty提供基礎支撐。
2.1.2 邏輯架構
2.1.2.1 Reactor通信調度層
該層的主要職責是監聽網絡的讀寫和連接操作,負責將網絡層的數據讀取到內存緩沖區中,然后觸發各種網絡事件,例如連接創建、連接激活、讀事件、寫事件等等。將這些事件觸發到PipeLine中,由PipeLine管理的職責鏈來后續進行處理。
2.1.2.2 PipeLine
PipeLine是職責鏈ChannelPipeLine,它負責事件在職責鏈中的有序傳播,同時負責動態的編排職責鏈。職責鏈可以選擇監聽和處理自己關心的事件,它可以攔截處理和向后/向前傳播事件。不同應用的Handler節點的功能也不同,通常情況下,往往會開發編解碼Handler用於消息的編解碼,它可以將外部的協議消息轉換成內部的POJO對象,這樣上層業務則只需要關心處理業務邏輯即可,不需要感知底層的協議差異和線程模型差異,實現層面的分層隔離。
2.1.2.3 業務邏輯編排層
業務邏輯編排層通常有兩類:一類是純粹的業務邏輯編排,還有一類是其他的應用層協議插件,用於特定協議相關的會話和鏈路管理。
2.1.2.4 分層設計
架構的不同層面,需要關心和處理的對象都不同,通常情況下,對於業務開發者,只需要關心職責鏈的攔截和業務Handler的編排,因為應用層協議棧往往是開發一次,到處運行,實際上對於業務開發者來說,只需要關心服務層的業務邏輯開發即可。各種應用協議以插件的形式提供,只有協議開發人員需要關注協議插件,對於其他業務開發人員來說,只需要關心業務邏輯定制即可。這種分層的架構設計理念實現了NIO框架各層之間的解耦,便於上層業務協議棧的開發和業務邏輯的定制。
正是由於Netty的分層架構設計合理,基於Netty的各種應用服務器和協議棧開發才能夠如雨后春筍般得到快速發展。
2.2 架構特點
2.2.1 高性能
性能是設計出來的,而不是測試出來的
- 采用異步非阻塞I/O類庫,基於Reactor模型實現,解決了傳統同步阻塞I/O模式下一個服務器無法平滑地處理線性增長的客戶端問題
- TCP接收和發送緩沖區使用直接內存代替堆內存,避免了內存復雜,提高讀寫性能
- 通過內存池循環利用ByteBuf,避免頻繁創建和銷毀帶來的性能損耗
- 可配置的IO線程數、TCP參數
- 采用環形數組緩沖區實現無鎖化並發編程
- 關鍵資源使用單線程串行化方式
- 通過引入計數器及時地申請釋放不再被引用的對象,細粒度的內存管理,減少GC
2.2.2 可靠性
- 鏈路有效性檢測
心跳機制進行檢測:空閑時檢測,事件通知
- 內存保護機制
計數器、重用、上限
- 優雅停機
2.2.3 可定制擴展性
- 責任鏈模式
- 基於接口開發
- 提供了大量工廠類
- 提供了大量的可配置參數
3. 應用
-
在互聯網中的應用:Dubbo
-
提供異步、高性能的NIO的通信框架
-
NIO客戶端和服務端
-
心跳檢測能力
-
斷連重連機制
-
流量控制
-
Dubbo協議的編解碼
-
-
大數據領域的應用:Apache Avro
-
提供異步、高性能的NIO的通信框架
-
NIO客戶端和服務端
-
心跳檢測能力
-
斷連重連機制
-
流量控制
-
-
游戲服務器的應用
-
為各進程提供高性能的異步網絡通信能力
-
自定義協議的編解碼
-
心跳檢測、流量整形、日志統計
-
SSL、黑白名單
-
內存池技術保證最大限度重用對象
-
4. 未來發展
-
廣泛的應用
-
深入的技術演進
- 支持Android
- 簡化處理器層次
- 更簡單更精確的緩沖區泄漏追蹤
- 更靈活的線程模型
- ...
-
活躍的社區
最后的提交在兩小時前
-
明確的Road Map
4.x
5.x