略過導覽

4.1 中的新功能和值得注意的變更

您知道此頁面會自動從 Github Wiki 頁面 生成嗎?您可以在 此處 自行進行改善!

此文件將帶您檢視 Netty 4.1 和 4.0 之間顯著變更和新功能的清單。

TL;DR

雖然我們已盡力保持與 4.0 的向下相容性,4.1 中仍然包含可能無法與 4.0 完全向下相容的多項新增功能。請務必針對新版本重新編譯您的應用程式。

重新編譯您的應用程式時,您可能會看到一些已不推薦使用的警告訊息。請務必全部修正這些警告訊息,並採用建議的替代方案,如此一來,您在升級到下一個版本時便能減少遇到的麻煩。

核心變更

Android 支援

由於

  • 行動裝置變得越來越強大,
  • ADK 中的 NIO 和 SSLEngine 已修正最著名的問題,並且
  • 使用者顯然想在行動應用程式中重複使用他們的編碼器和處理常式,

因此,我們決定正式支援 Android(4.0 或更高版本)。

不過,我們目前尚未針對 Android 進行自動化測試套件。如果您發現任何與 Android 相關的問題,請隨時 提出問題。也請考慮為專案做出貢獻,讓 Android 測試成為建置流程的一部分。

ChannelHandlerContext.attr(..) == Channel.attr(..)

這兩個 ChannelChannelHandlerContext 介面實作 AttributeMap 可以讓一個使用者連接一個或是多個使用者自訂屬性到它們身上。有時可能會造成使用者困惑的是 ChannelChannelHandlerContext 有他們自己的儲存空間來存放使用者自訂屬性。例如,即使你放入了屬性『KEY_X』並透過 `Channel.attr(KEY_X).set(valueX)` 設定屬性值,你也永遠無法透過 `ChannelHandlerContext.attr(KEY_X).get()` 取得屬性值,反之亦然。這種行為不僅令人困惑,還會造成記憶體浪費。

為了解決這個問題,我們決定在 Channel 內部只保留一個 map。 AttributeMap 總是用 AttributeKey 當做它的 key。 AttributeKey 確保每個 key 都具有唯一性,因此每個 Channel 擁有超過一個 attribute map 沒有任何意義。只要使用者在自己的 ChannelHandler 中定義自己的 AttributeKey 為一個 private static final,就不會有重複 key 的風險。

Channel.hasAttr(...)

現在我們可以有效率的檢查屬性是否存在。

更容易且更精確的緩衝區洩漏追蹤

在過去,要找出緩衝區洩漏發生的位置並不簡單,且洩漏警告並沒有提供太多資訊。我們現在有一個進階的洩漏回報機制,可以透過增加效能的代價來啟用。

請參閱 參考計數物件 以取得更多資訊。由於此功能的重要性,也已回傳到 4.0.14.Final。

PooledByteBufAllocator 作為預設分配器

在 4.x 中, UnpooledByteBufAllocator 是預設分配器,儘管它有它的限制。由於 PooledByteBufAllocator 已經在實務環境中使用一段時間,且我們有一個進階的緩衝區洩漏追蹤機制,現在正是讓它成為新預設分配器的時候了。

全球唯一的頻道 ID

現在每個 Channel 都有一個全球唯一的 ID,由下列元素所產生

  • MAC 位址 (EUI-48 or EUI-64),最好是全球唯一的,
  • 目前的處理序 ID,
  • System#currentTimeMillis()
  • System#nanoTime()
  • 一個隨機的 32 位元整數,
  • 一個遞增的 32 位元整數.

可以使用 `Channel.id()` 方法取得 Channel 的 ID。

EmbeddedChannel 易用性

EmbeddedChannel 中的 readInbound()readOutbound() 會傳回 ad-hoc 型別參數,因此您不必向下調整其傳回值。這將大幅減少單元測試程式碼的冗餘。

EmbeddedChannel ch = ...;

// BEFORE:
FullHttpRequest req = (FullHttpRequest) ch.readInbound();

// AFTER:
FullHttpRequest req = ch.readInbound();

可以使用 Executor 而非 ThreadFactory

有些應用程式需要使用者在指定的 Executor 中執行其任務。4.x 指定 ThreadFactory 建立事件迴圈,但現在不再需要。

如需有關此變更的更多資訊,請參閱 pull request #1762

類別載入器友善度

某些型別(如 AttributeKey)對在容器環境中執行的應用程式不友善,但現在不再如此。

ByteBufAllocator.calculateNewCapacity()

計算擴充 ByteBuf 的新容量的邏輯已從 AbstractByteBuf 移到 ByteBufAllocator,因為 ByteBufAllocator 更了解它管理的緩衝區的容量計算。

新的編解碼器和處理常式

  • 二進制 Memcache 通訊協定編解碼器
  • 壓縮編解碼器
    • BZip2
    • FastLZ
    • LZ4
    • LZF
  • DNS 通訊協定編解碼器
  • HAProxy 通訊協定編解碼器
  • MQTT 通訊協定編解碼器
  • SPDY/3.1 支援
  • STOMP 編解碼器
  • 支援版本 4、4a 和 5 的 SOCKSx 編解碼器;請參閱 socksx 套件。
  • XmlFrameDecoder,可串流 XML 文件。
  • JsonObjectDecoder,可串流 JSON 物件。
  • IP 篩選處理常式

其他編解碼器變更

AsciiString

AsciiString 是一種新的 CharSequence 實作,僅包含 1 個位元的字元。當您處理 US-ASCII 或 ISO-8859-1 字串時,您會發現這個類別很好用。

舉例來說,Netty 中的 HTTP 編解碼器和 STOMP 編解碼器使用 AsciiString 來表示標頭名稱。因為 AsciiString 在編碼成 ByteBuf 時沒有任何轉換成本,所以它保證效能比 String 更佳。

TextHeaders

TextHeaders 提供一種泛用的資料結構,適用於 HTTP 標頭般的字串 多重對應HttpHeaders 也已使用 TextHeaders 重新撰寫。

MessageAggregator

MessageAggregator 提供一種泛用的功能,可將多個較小的訊息集合成一個較大的訊息,就像 HttpObjectAggregator 所做的。HttpObjectAggregator 也已使用 MessageAggregator 重新撰寫。

HttpObjectAggregator 改善超大訊息處理

在 4.0 中,即使存在 100-continue 標頭,也無法在客戶端傳送內容之前拒絕過大 HTTP 訊息。

此版本新增一個可覆寫方法,稱為 `handleOversizedMessage`,以便使用者可以執行他或她偏好的工作。預設情況下,它會回應「413 要求實體太大」的回應並關閉連線。

ChunkedInputChunkedWriteHandler

ChunkedInput 有兩個新方法:progress()length(),分別傳回其傳輸進度和串流總長度。 ChunkedWriteHandler 使用此資訊來通知 ChannelProgressiveFutureListener

SnappyFramedEncoderSnappyFramedDecoder

這兩個類別已重新命名為 SnappyFrameEncoderSnappyFrameDecoder。舊類別標記為不推薦使用,而它們實際上是新類別的子類別。

最後於 19-Jul-2024 擷取