Netty5.x中新增和值得注意的點


最近事情多,OneCoder折騰了好幾天,總算翻譯完成了。
 
該文檔會列出在Netty新版本中值得注意變化和新特性列表。幫助你的應用更好的適應新的版本。
 
不像Netty3.x和4.x之間的變化,5.x沒有那么大的變化,不過也取得了其簡化設計中的一些突破性進展.。我們力求盡可能平滑的從4.x版本過度到5.x版本,如果你在遷移過程中遇到任何問題,請告知我們。
 
核心變化
 
 
支持Android
 
提供了:
  •  移動設備變成更加強大
  • 通過Ice Cream Sandwich解決了在ADK中最著名的與NIO和SSLEngine相關的問題,且
  • 用戶顯然想要重用他們應用中的的編解碼和處理器代碼。
我們決定官方支持Android(4.0及以上版本)
 
簡化處理器層次
 
ChannelInboundHandler和ChannelOutboundHandler整合為ChannelHandler。ChannelHandler現在包含輸入和輸出的處理方法。
 
ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter和ChannelDuplexHandlerAdapter已被廢棄,由 ChannelHandlerAdapter代替。
 
由於現在無法區分處理器(handler) 是輸入還是輸出的處理器,CombinedChannelDuplexHandler現在由 ChannelHandlerAppender代替。
 
更多相關變化,可參考 https://github.com/netty/netty/pull/1999
 
channelRead0() → messageReceived()
 
我知道。這是一個愚蠢的錯誤。如果你使用了SimpleChannelInboundHandler,你需要把channelRead0()重命名為messageReceived()。
 
廢棄中移除的
 
Channel.deregister()已被移除。不再生效和被使用。取而代之的,我們將允許Channel被充注冊到不同的事件循環。
 
ChannelHandlerContext.attr(..) == Channel.attr(..)
 
Channel和ChannelHandlerContext類都實現了AttributeMap接口,使用戶可以在其上關聯一個或多個屬性。有時會讓用戶感到困惑的是Channel和ChannelHandlerContext都有其自己的存儲用戶定義屬性的容器。例如,即使你通過Channel.attr(KEY_X).set(valueX)給屬性'KEY_X’賦值,你卻無法通過ChannelHandlerContext.attr(KEY_X).get()方法獲取到值。反之亦是如此。這種行為不僅僅令人不解而且還浪費內存。
 
為了解決這個問題,我們決定每個Channel內部僅保留一個map。AttributeMap總是用AttributeKey作為它的key。AttributeKey確保鍵的唯一性,因此每個Channel中如果存在一個以上的屬性容易是多余的。只要用戶把他自己的AttributeKey定義成ChannelHandler的private static final變量,就不會有出現重復key的風險。
 
更簡單更精確的緩沖區泄漏追蹤
 
 
之前,查找緩沖區泄漏是很困難的,並且泄漏的警告信息也不是很有幫助。現在我們有了增強的泄漏報告機制,該機制會在增長超過上限時觸發。
 
更多的信息可查看:http://netty.io/wiki/reference-counted-objects.html 。由於該特性十分重要,所以也移植入了4..0.14.Final版中。
 
PooledByteBufAllocator成為默認的allocator
 
在4.x版本中,UnpooledByteBufAllocator是默認的allocator,盡管其存在某些限制。現在PooledByteBufAllocator已經廣泛使用一段時間,並且我們有了增強的緩沖區泄漏追蹤機制,所以是時候讓PooledByteBufAllocator成為默認了。
 
全局唯一的Channel ID
 
 
每個Channel現在有了全局唯一的ID,其生成的依據是:
 
   * MAC地址(EUI-48或是EUI-64),最好是全局唯一的,
   * 當前進程的ID
   * System#currentTimeMillis()
   * System#nanoTime()
   * 隨機的32位整數,以及
   * 系列遞增的32位整數
 
可通過Channel.id()方法獲取Channel的ID。
 
更靈活的線程模型
 
 
增加了新的ChannelHandlerInvoker接口,用於使用戶可以選擇使用哪個線程調用事件處理方法。替代之前的在向ChannelPipeline添加 ChannelHandler時指定一個EventExecutor的方式,使用該特性需要指定一個用戶自定義的 ChannelHandlerInvoker實現。
 
 
EmbeddedChannel的易用性
 
EmbeddedChannel中的readInbound()和readOutbound()方法返回專門類型的參數,因此你不必在轉換他們的返回值。這可以簡化你的測試用例代碼。
EmbeddedChannel ch = ...;

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

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

 
使用Executor代替ThreadFactory
 
 
有些應用要求用戶使用Executor運行他們的任務。4.x版本要求用戶在創建事件循環(event loop)時指定ThreadFacotry,現在不再是這樣了。
 
關於該變化的更多信息,可參考:https://github.com/netty/netty/pull/1762
 
Class loader友好化
 
一些類型,如AttributeKey對於在容器環境下運行的應用是不友好的,現在不是了。
 
編解碼和處理器(handlers)
 
   * XmlFrameDecoder支持流式的XML文檔
 
   * 二進制的memcache協議編解碼
   * 支持SPDY/3.1 (也移植到了4.x版本)
   * 重構了HTTP多部分的編解碼
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM