Netty學習一:基本知識


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

    1. 提供異步、高性能的NIO的通信框架

    2. NIO客戶端和服務端

    3. 心跳檢測能力

    4. 斷連重連機制

    5. 流量控制

    6. Dubbo協議的編解碼

  • 大數據領域的應用:Apache Avro

    1. 提供異步、高性能的NIO的通信框架

    2. NIO客戶端和服務端

    3. 心跳檢測能力

    4. 斷連重連機制

    5. 流量控制

  • 游戲服務器的應用

    1. 為各進程提供高性能的異步網絡通信能力

    2. 自定義協議的編解碼

    3. 心跳檢測、流量整形、日志統計

    4. SSL、黑白名單

    5. 內存池技術保證最大限度重用對象

4. 未來發展

  • 廣泛的應用

  • 深入的技術演進

    1. 支持Android
    2. 簡化處理器層次
    3. 更簡單更精確的緩沖區泄漏追蹤
    4. 更靈活的線程模型
    5. ...
  • 活躍的社區

    最后的提交在兩小時前

  • 明確的Road Map

    4.x

    5.x


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM