1. 程式人生 > >Netty 理論詳解

Netty 理論詳解

Netty 簡介

  • Netty 是 JBoss 公司用 Java 寫的一個 Jar 包(庫),目的是快速開發高效能、高可靠性的網路伺服器和客戶端程式
  • Netty 提供非同步、無阻塞、事件驅動的網路應用程式框架和工具
  • Netty 是目前公認的網路程式設計最好的框架,官網地址:http://netty.io/
  • GitHub 託管地址:https://github.com/netty/netty
  • Netty 底層封裝的也是 Java NIO,所以也叫NIO框架,常用於開發分散式系統

Netty is an asynchronous event-driven network application framework


for rapid development of maintainable high performance protocol servers & clients.

Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.

'Quick and easy' doesn't mean that a resulting application will suffer from a maintainability or a performance issue. Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, Netty has succeeded to find a way to achieve ease of development, performance, stability, and flexibility without a compromise.

Netty Features( 特色)

Design( 設計)

  • 統一的 API,適用於不同的協議(阻塞和非阻塞)
  • 基於靈活、可擴充套件的事件驅動模型
  • 高度可定製的執行緒模型,單執行緒、多執行緒池
  • 可靠的無連線資料Socket支援(UDP)
  • Unified API for various transport types - blocking and non-blocking socket
  • Based on a flexible and extensible event model which allows clear separation of concerns
  • Highly customizable thread model - single thread, one or more thread pools such as SEDA
  • True connectionless datagram socket support (since 3.1)

Ease of use( 易用性)

Well-documented Javadoc, user guide and examples

No additional dependencies, JDK 5 (Netty 3.x) or 6 (Netty 4.x) is enough

Note: Some components such as HTTP/2 might have more requirements. Please refer to the Requirements page for more information.

  • 最早 Java 網路程式設計:使用 java.net + java.io,熟悉的 Socket API 就是在 java.net 包中。
  • 從 JDK 1.4 開始,Java 網路程式設計可以使用效能更好的:java.nio
  • 目前 Java 網路程式設計通常使用成熟的框架,如:Netty 、Mina,Grizzly

Performance( 效能)

  • 更好的吞吐量,低延遲 (Better throughput, lower latency)
  • 更省資源 (Less resource consumption)
  • 儘量減少不必要的記憶體拷貝 (Minimized unnecessary memory copy)
  • 不再因過快、過慢或超負載連線導致 OutOfMemoryError
  • 不再有在高速網路環境下 NIO 讀寫頻率不一致的問題

Security( 安全)

  • 完整的 SSL/TLS 和 STARTTLS 的支援 (Complete SSL/TLS and StartTLS support)
  • 能在 Applet 與 Android 的限制環境執行良好

Netty VS Mina

  • JBOOS 的 Netty 與 Apache 的 Mima 都是目前 Java 網路程式設計主流的框架之一。
  • Mina 將核心和一些特性的聯絡過於緊密,使得使用者在不需要這些特性的時候無法脫離,相比之下效能會有所下降,而 Netty解決了這個設計問題
  • Netty 的文件更清晰,很多 Mina 的特性在 Netty 裡都有
  • Netty 更新週期更短,新版本的釋出比較快
  • 兩者架構差別不大,Mina 靠 apache生存,而 Netty 靠 jboss,和 jboss 的結合度非常高,Netty 有對 google protocal buf 的支援,有更完整的 ioc 容器支援( spring,guice,jbossmc 和 osgi);
  • Netty 比 Mina 使用起來更簡單,Netty 中可以自定義的處理 upstream events 和 downstream events,可以使用 decoder 和encoder 來解碼和編碼傳送內容
  • Netty 和 Mina 在處理 UDP 時有一些不同,Netty 將 UDP 無連線的特性暴露出來;而 Mina 對 UDP 進行了高階層次的抽象,可以把 UDP 當成"面向連線"的協議,而要 Netty 做到這一點比較困難。

應用領域

·網際網路行業·

  • 隨著網站規模的不斷擴大,系統併發訪問量也越來越高,傳統基於 Tomcat 等 Web 容器的垂直架構已經無法滿足需求,需要拆分應用進行服務化,以提高開發和維護效率。從組網情況看,垂直的架構拆分之後,系統採用分散式部署,各個節點之間需要遠端服務呼叫,高效能的 RPC(Remote Procedure Call Protocol-遠端過程呼叫協議) 框架必不可少,Netty 作為非同步高效能的通訊框架,往往作為基礎通訊元件被這些 RPC 框架使用。
  • 典型的應用有:阿里分散式服務框架 Dubbo 的 RPC 框架使用 Dubbo 協議進行節點間通訊,Dubbo 協議預設使用 Netty 作為基礎通訊元件,用於實現各程序節點之間的內部通訊,它的架構圖如下:

  • 其中,服務提供者和服務消費者之間,服務提供者、服務消費者和效能統計節點之間使用 Netty 進行非同步/同步通訊。
  • 除了 Dubbo 之外,淘寶的訊息中介軟體 RocketMQ 的訊息生產者和訊息消費者之間,也採用 Netty 進行高效能、非同步通訊。
  • 除了阿里系和淘寶系之外,很多其它的大型網際網路公司或者電商內部也已經大量使用 Netty 構建高效能、分散式的網路伺服器。

·遊戲行業·

  • 無論是手遊服務端、還是大型的網路遊戲,Java 語言得到了越來越廣泛的應用。Netty 作為高效能的基礎通訊元件,它本身提供了 TCP/UDP 和 HTTP 協議棧,非常方便定製和開發私有協議棧
  • 賬號登陸伺服器、地圖伺服器之間可以方便的通過 Netty 進行高效能的通訊,架構示意圖如下:
     

·大資料領域·

  • 經典的 Hadoop 的高效能通訊和序列化元件 Avro 的 RPC 框架,預設採用 Netty 進行跨節點通訊,它的 Netty Service 基於 Netty 框架二次封裝實現
  • 大資料計算往往採用多個計算節點和一個/N個彙總節點進行分散式部署,各節點之間存在海量的資料交換。由於 Netty 的綜合性能是目前各個成熟 NIO 框架中最高的,因此,往往會被選中用作大資料各節點間的通訊。

·通訊行業·

  • Netty 的非同步高效能、高可靠性和高成熟度的優點,使它在通訊行業得到了大量的應用。

自學建議

 

······下一篇《 Netty 入門示例詳解