Netty學習一:基本知識

1. Netty基礎知識

1.1 Netty出現的緣由

  • Java NIO 太難用,存在BUG(如Epoll-Bug)
  • 基於第一點,大多數高性能服務器被C和C++盤踞
  • 一樣基於第一點,Java NIO編程門檻高
  • 業界其餘的NIO框架不成熟

1.2 Netty

Netty是由JBOSS提供的一個Java開源框架。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可靠性的網絡服務器和客戶端程序。react

也就是說,Netty 是一個基於NIO的客戶、服務器端編程框架,使用Netty 能夠確保你快速和簡單的開發出一個網絡應用,例如實現了某種協議的客戶,服務端應用。Netty至關簡化和流線化了網絡應用的編程開發過程,例如,TCP和UDP的socket服務開發。apache

「快速」和「簡單」並不意味着會讓你的最終應用產生維護性或性能上的問題。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

相關文章
相關標籤/搜索