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

转载 2015年07月10日 10:29:13


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

(官方翻译)


  本文档列出了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()方法返回专门类型的参数,因此你不必在转换他们的返回值。这可以简化你的测试用例代码。
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多部分的编解码



玩转Netty – 从Netty3升级到Netty4

这篇文章主要和大家分享一下,在我们基础软件升级过程中遇到的经典Netty问题。当然, 官方资料 也许是一个更好的补充。另外,大家如果对Netty及其Grizzly架构以及源码有疑问的,欢迎交流。后...
  • xiaopingping___
  • xiaopingping___
  • 2016年04月29日 11:01
  • 2102

Netty5入门(4)

这个类实现SimpleChannelInboundHandler,SimpleChannelInboundHandler是一个抽象类,实现了中定义的channelRead方法,但同时定义了一个抽象的m...
  • kmyhy
  • kmyhy
  • 2015年03月10日 16:02
  • 7732

Netty5完整例子

  • 2014年09月10日 17:37
  • 6KB
  • 下载

netty 5 jar

  • 2015年01月08日 21:14
  • 8.95MB
  • 下载

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

最近事情多,OneCoder折腾了好几天,总算翻译完成了。 翻译自官方文档:http://netty.io/wiki/new-and-noteworthy-in-5.x.html   ...
  • AlbertFly
  • AlbertFly
  • 2016年05月28日 23:25
  • 2174

Netty3 VS Netty4 之线程模型

下面小节我们就详细得对Netty3和Netty4版本的I/O线程模型进行对比,以方便大家掌握两者的差异,在升级和使用中尽量少踩雷。 1 Netty 3.X 版本线程模型 Netty 3.X的I/O...
  • kobejayandy
  • kobejayandy
  • 2016年03月27日 15:45
  • 6112

Netty4更新

netty现在应该是java界最流行的网络框架之一了,高性能,可扩展,代码优雅。之前做的页游都是用netty3.x来做网络层通信。最近看到netty4快要出来了,一些新的特性还是很值得推介的。 ...
  • janeky
  • janeky
  • 2013年04月11日 00:38
  • 7430

Netty4&5源码编译所需jar包

  • 2014年09月29日 17:19
  • 3.95MB
  • 下载

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

最近事情多,OneCoder折腾了好几天,总算翻译完成了。 翻译自官方文档:http://netty.io/wiki/new-and-noteworthy-in-5.x.html   ...
  • AlbertFly
  • AlbertFly
  • 2016年05月28日 23:25
  • 2174

Netty 4.x 实战详解

Netty 4.x 实战详解目前Netty的最新稳定版本是 Netty 4.1.9, 本文根据该版本进行开发介绍。目录 Netty 4x 实战详解 目录 开发前准备工作 代码实现 一 服务器 1服务器...
  • lms1719
  • lms1719
  • 2017年04月21日 18:03
  • 610
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Netty5.x 和3.x、4.x的区别及注意事项(官方翻译)
举报原因:
原因补充:

(最多只允许输入30个字)