1. 程式人生 > >你知道Netty是如何實現更高效能的嗎?

你知道Netty是如何實現更高效能的嗎?

作為語言基礎類庫,Java 自身的 NIO 設計更偏底層,這本無可厚非,但是對於一線的應用開發者,其複雜性、擴充套件性等方面,就存在一定的侷限了。在基礎 NIO 之上,Netty 構建了更加易用、高效能的網路框架,廣泛應用於網際網路、遊戲、電信等各種領域。

對比 Java 標準 NIO 類庫,你知道 Netty 是如何實現更高效能的嗎?

典型回答

單獨從效能角度,Netty 在基礎的 NIO 等類庫之上進行了很多改進,例如:

更加優雅的 Reactor 模式實現、靈活的執行緒模型、利用 EventLoop 等創新性的機制,可以非常高效地管理成百上千的 Channel。

充分利用了 Java 的 Zero-Copy 機制,並且從多種角度,“斤斤計較”般的降低記憶體分配和回收的開銷。例如,使用池化的 Direct Buffer 等技術,在提高 IO 效能的同時,減少了物件的建立和銷燬;利用反射等技術直接操縱 SelectionKey,使用陣列而不是 Java 容器等。

使用更多原生代碼。例如,直接利用 JNI 呼叫 Open SSL 等方式,獲得比 Java 內建 SSL 引擎更好的效能。

在通訊協議、序列化等其他角度的優化。

總的來說,Netty 並沒有 Java 核心類庫那些強烈的通用性、跨平臺等各種負擔,針對性能等特定目標以及 Linux 等特定環境,採取了一些極致的優化手段。

知識擴充套件

首先,我們從整體瞭解一下 Netty。按照官方定義,它是一個非同步的、基於事件 Client/Server 的網路框架,目標是提供一種簡單、快速構建網路應用的方式,同時保證高吞吐量、低延時、高可靠性。

從設計思路和目的上,Netty 與 Java 自身的 NIO 框架相比有哪些不同呢?

我們知道 Java 的標準類庫,由於其基礎性、通用性的定位,往往過於關注技術模型上的抽象,而不是從一線應用開發者的角度去思考。我曾提到過,引入併發包的一個重要原因就是,應用開發者使用 Thread API 比較痛苦,需要操心的不僅僅是業務邏輯,而且還要自己負責將其對映到 Thread 模型上。Java NIO 的設計也有類似的特點,開發者需要深入掌握執行緒、IO、網路等相關概念,學習路徑很長,很容易導致程式碼複雜、晦澀,即使是有經驗的工程師,也難以快速地寫出高可靠性的實現。

Netty 的設計強調了 “Separation Of Concerns”,通過精巧設計的事件機制,將業務邏輯和無關技術邏輯進行隔離,並通過各種方便的抽象,一定程度上填補了了基礎平臺和業務開發之間的鴻溝,更有利於在應用開發中普及業界的最佳實踐。

另外,Netty > java.nio + java. net!

從 API 能力範圍來看,Netty 完全是 Java NIO 框架的一個大大的超集,你可以參考 Netty 官方的模組劃分。

 

 

除了核心的事件機制等,Netty 還額外提供了很多功能,例如:

從網路協議的角度,Netty 除了支援傳輸層的 UDP、TCP、SCTP協議,也支援 HTTP(s)、WebSocket 等多種應用層協議,它並不是單一協議的 API。

在應用中,需要將資料從 Java 物件轉換成為各種應用協議的資料格式,或者進行反向的轉換,Netty 為此提供了一系列擴充套件的編解碼框架,與應用開發場景無縫銜接,並且效能良好。

它擴充套件了 Java NIO Buffer,提供了自己的 ByteBuf 實現,並且深度支援 Direct Buffer 等技術,甚至 hack 了 Java 內部對 Direct Buffer 的分配和銷燬等。同時,Netty 也提供了更加完善的 Scatter/Gather 機制實現。

如果你想學好JAVA這門技術,也想在IT行業拿高薪,可以參加我們的訓練營課程,選擇最適合自己的課程學習,技術大牛親授,8個月後,進入名企拿高薪。我們的課程內容有:Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點。如果你想拿高薪的,想學習的,想就業前景好的,想跟別人競爭能取得優勢的,想進阿里面試但擔心面試不過的,你都可以來,q群號為:180705916 進群免費領取學習資料。