Netty5.x 和3.x、4.x的区别及注意事项(官方翻译)

 

Netty5.x 和3.x、4.x的区别及注意事项html

(官方翻译)java

 

 

  本文档列出了Netty5新版本中值得注意变化和新特性列表。帮助你的应用更好的适应新的版本。
 
  不像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实现。
 
  关于该变化更多的信息,可参考: https://github.com/netty/netty/commit/132af3a485015ff912bd567a47881814d2ce1828
 
 
EmbeddedChannel的易用性
 
  EmbeddedChannel中的readInbound()和readOutbound()方法返回专门类型的参数,所以你没必要在转换他们的返回值。这能够简化你的测试用例代码。
[java]  
 
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多部分的编解码
 
地址:http://blog.csdn.net/hills/article/details/46827393 ;
相关文章
相关标签/搜索