1. 程式人生 > >《NETTY官方文件》4.1的新特性及注意點

《NETTY官方文件》4.1的新特性及注意點

原文連結  譯者:裘卡

此文件涵蓋了netty4.0到4.1值得關注的變更點及新特性。

儘管我們盡力做到對4.0的向後相容,4.1仍包含了一些無法完全向後相容4.0的特性。請確保升級之後對應用進行重新編譯。

在重新編譯應用以後,你會看到一些deprecation的警告。請一定按照提示修改為相應的替代方案,以減少升級之後產生的問題。

核心變更

對Android的支援

考慮到:

– 移動裝置已經越來越強大了

– Ice Cream Sandwich版本已經修正了ADK中突出的NIO和SSLEngine的問題

– 使用者希望可以在移動應用中複用codesc和handlers

因此我們決定對Android(4.0及以上)進行官方支援。

但是,我們現在仍然沒有針對Android的自動化測試套件。如果發現Android相關的問題,煩請提交一個issue。也請考慮直接對專案進行貢獻,使Android tests成為構建的一部分。

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

ChannelChannelHandlerContext 都實現了 AttributeMap 介面,可以附加使用者自定義屬性。但由於 ChannelChannelHandlerContext 的自定義屬性儲存是相對獨立的,有時候就會對使用者造成困擾。比如,當你通過Channel.attr(KEY_X).set(valueX)新增一個’KEY_X’屬性時,你無法從ChannelHandlerContext.attr(KEY_X).get()獲取到,反之亦然。這不僅是一種困擾,同時也是記憶體的浪費。

為了解決這個問題,我們決定每個 Channel 內部僅保留一個map。 AttributeMap 使用 AttributeKey 作為key。 AttributeKey 保證了各個key之間的唯一性,因此每個 Channel 就只會有一個屬性map。當用戶在他或她自己的 ChannelHandler 裡面定義一個private static final的 AttributeKey 欄位,就不會再有重複key的風險。

Channel.hasAttr(…)

現在可以判斷一個屬性是否存在或者未生效了。

buffer洩露跟蹤將更加容易並且精準

原先,洩露的warning往往沒什麼用,也很難找到bufffer到底在哪兒洩露的。現在我們可以啟用更高階的洩露報告機制了,代價則是增加一定的開銷。

檢視 Reference counted objects 瞭解更多。因為此特性十分重要,因此我們也將其移植到了4.0.14.Final版本中。

PooledByteBufAllocator將成為預設allocator

儘管UnpooledByteBufAllocator有一些限制(limitation),4.x版本中,它仍然是預設的allocator。由於PooledByteBufAllocator已經廣泛使用了(has been in the wild )一段時間了,並且也有了更高階的buffer洩露跟蹤機制,因此,是時候把其作為預設allocator了。

全域性唯一的channel ID

每個 Channel 都會有一個全域性唯一的ID,生成規則如下:

  • MAC 地址(EUI-48 or EUI-64),最好是全域性唯一的
  • 當前程序ID
  • System#currentTimeMillis()
  • System#nanoTime()
  • 32-bit的隨機integer
  • 序列化遞增的32-bit integer.

可以通過呼叫 Channel.id() 獲取Channel的ID值。

EmbeddedChannel易用性提升

現在EmbeddedChannel的readInbound()和readOutbound()會返回ad-hoc型別的引數,這樣就不需要對返回值進行向下轉型了。這樣,你的單元測試程式碼會簡潔很多。

EmbeddedChannel ch = ...;

// 以前:
FullHttpRequest req = (FullHttpRequest) ch.readInbound();

// 此後:
FullHttpRequest req = ch.readInbound();

可使用Executor代替ThreadFactory

有些應用需要使用自己的 Executor 跑任務。而4.x版本則需要使用者在建立event loop時指定ThreadFactory,以後就不需要了。

Class loader友好性

AttributeKey之類對運行於容器中的應用不友好的問題已解決。

ByteBufAllocator.calculateNewCapacity()

ByteBuf容量擴增的計算邏輯已經從AbstractByteBuf中遷到了ByteBufAllocator中。因為ByteBufAllocator更能把握它所管理的buffers的容量計算。

新的codecs及handlers

  • Binary memcache protocol codec
  • Compression codecs
    • BZip2
    • FastLZ
    • LZ4
    • LZF
  • DNS protocol codec
  • HAProxy protocol codec
  • MQTT protocol codec
  • SPDY/3.1 支援
  • STOMP codec
  • SOCKSx codec 支援版本 4, 4a, 及 5; 參見 socksx 包.
  • XmlFrameDecoder 支援XML文件流(streaming of XML documents)
  • JsonObjectDecoder 支援JSON物件流(streaming of JSON objects)
  • IP filtering handlers

其他codec變更

AsciiString

AscciiString 是隻包含單位元組字元的CharSequence實現類。對於處理US-ASCII及ISO-8859-1字串會很有用。

比如,Netty中的HTTP codec及STOMP codec使用AsciiString來表示首部名(header names)。因為將其轉換為ByteBuf時是沒有額外開銷的,因此,也能獲得比String更佳的效能。

TextHeaders(譯者注:截至最新的netty-all 4.1.9.Final,並未發現此API,而5.0則含有此API)

TextHeaders 提供了HTTP首部風格(header-like)的通用字串 mutimaps 資料結構。HttpHeaders也使用TextHeaders進行了重寫。

MessageAggregator

MessageAggregator 能夠像HttpObjectAggregator一樣將批量的小訊息聚合為大訊息。HttpObjectAggregator同樣也使用MessageAggregator進行了重寫。

HttpObjectAggregator可以更好的處理大尺寸(oversized)訊息

4.0版本中,在客戶端傳送內容之前,是無法拒絕接收超大體積的HTTP訊息的,即使在100-continue狀態時也無法做到。

新版本增加了可覆蓋的handleOversizedMessage方法,使用者可以根據自己的需求進行覆寫。預設情況下,會響應’413 Request Entity Too Large’並且關閉連線。

ChunkedInput 及 ChunkedWriteHandler

SnappyFramedEncoder 及 SnappyFramedDecoder

這兩個類重新命名為 SnappyFrameEncoder 及 SnappyFrameEncoder。舊類已經被標記為已過時,並且實質上就是新類的子類。