Netty 4.1中新内容及值得注意的地方

Netty 4.1中新内容及值得注意的地方

此文档将会带你了解4.1相对于4.0的新特性及值得注意的地方

简述(TL;DR)

尽管我们尽我们最大的努力保持对4.0的向后兼容,4.1依然包含许多不能与4.0保持完美兼容的特性。请重新编译你的应用以确认新版本(4.1)。

当你重新编译你的应用时,你可能发现一些异常警告。请使用推荐操作修复它们,这样在你使用新版本时会遇到更少的麻烦。

核心改变

安卓支持

考虑到以下原因:

  • 移动设备将变得越来越重要
  • 大多数已知的关于NIO和SSLEngine的issues从安卓4.0已经被修复
  • 人民更希望在它们的移动设备中重新启用解码器和处理器

我们觉得正式支持安卓(4.0+)。

无论如何,我们还没有针对安卓的自动化测试工具。如果你发现任何关于安卓的问题,请自由的创建一个issue。同样你可以捐献到我们以保证安卓测试成为项目构建中的一部分。

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

ChannelChannelHandlerContext都实现了AttributeMap 接口用来附加用户的自定义数据。使我们困惑的是ChannelChannelHandlerContext使用各自的存储来存放用户的自定义数据。例如,假使你使用Channel.attr(KEY_X).set(valueX)来设置KEY_X,但是你不能使用ChannelHandlerContext.attr(KEY_X).get()来读取数据。这种行为不仅使人迷惑而且浪费内存。

为了解决这个issue,我们决定在每个Channel内部只保留一个Map。AttributeMap 总是使用AttributeKey来作为它的Key。AttributeKey确保对于每个Key保持唯一性,因而确保对于每个Channel拥有不超过一个的AttributeMap。只要用户为它们自己的ChannelHandler定义私有、静态、不变的AttributeKey,那么对于key的重复是没有风险的。

Channel.hasAttr(...)

它现在可以检测一个属性是否存在或有效。

更快更明确的缓冲区泄漏跟踪

以前,查找缓冲区泄漏的原因是一件不容易的事,而且泄漏警告也不是那么有帮助。我们现在有了一个更先进但会增加开销的泄漏报告机制。

查看Reference counted objects 查看更多信息。由于它的重要性,这个特性同样会移植到4.0.14.Final版本。

PooledByteBufAllocator将作为默认分配器

在4.x版本时代,UnpooledByteBufAllocator移植作为默认分配器而不顾它的诸多限制。现在PooledByteBufAllocator已经逐渐回归自然并且我们拥有了更先进的泄漏跟踪机制,是时候让它作为默认分配器了。

全局唯一通道ID

每个Channel会拥有一个全局唯一ID,ID会从以下信息为基础生成:

  • MAC地址 (EUI-48 or EUI-64),优先全局唯一的一个
  • 当前进程号PID
  • 系统毫秒数System#currentTimeMillis()
  • 系统纳秒数System#nanoTime()
  • 一个随机的32位的int
  • 一个递增的32位的int

Channel的ID可以由方法Channel.id()获得。

EmbeddedChannel可用性

EmbeddedChannel 中的readInbound()readOutbound()方法将会返回一个指定类型参数,你不需要再强转它们的返回值。这将会减少你相当一部分的单元测试代码。

EmbeddedChannel ch = ...;

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

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

使用Executor代替ThreadFactory

一些应用需要在指定的Executor总运行它们的任务。4.x版本中需要用户创建一个事件处理单元时指定一个ThreadFactory,但是这都将是过去时了。

关于这个改进的更多信息,请参见the pull request #1762.

对类加载器友好

一些类型对运行在容器环境的应用不友好,例如AttributeKey,但这种情况也不会再发生了。

ByteBufAllocator.calculateNewCapacity()

计算可扩容ByteBuf容量大小的逻辑已经从AbstractByteBuf移到了ByteBufAllocator,因为ByteBufAllocator更清楚的知道它所管理的缓存区的大小。

新编/解码器及处理器

  • 二进制缓存协议编/解码器
  • 压缩编/解码器
    • BZip2
    • FastLZ
    • LZ4
    • LZF
  • DNS协议编/解码器
  • HAProxy协议编/解码器
  • MQTT协议编/解码器
  • SPDY/3.1协议编/解码器
  • STOMP协议编/解码器
  • 支持版本4,4a,5的SOCKSx协议编/解码器,查看socksx包
  • 支持XML文档流的XmlFrameDecoder
  • 支持JSON对象流的JsonObjectDecoder
  • IP过滤处理器

其他编码变化

AsciiString

AsciiString 是一个新的只包含一个字节的CharSequence的实现。在处理US-ASCIIISO-8859-1 字符串时你会发现它很有用。

举例来说,HTTPSTOMP编/解码器在Netty中使用AsciiString来代表请求头名。因为AsciiString转换到ByteBuf不需要任何代价,它保证比使用String性能更好。

TextHeaders

TextHeaders 提供一种通用的数据结构来存储HTTP的头数据就像多重映射的字符串。HttpHeaders同样使用TextHeaders重写。

MessageAggregator

MessageAggregator提供了通用的函数来合并多个小消息成一个大消息,就像HttpObjectAggregator做的一样。HttpObjectAggregator同样被MessageAggregator重写。

HttpObjectAggregator对容量超限消息更好的处理机制

在4.0中,没有办法在客户端发送内容之前拒绝一个容量超限的HTTP消息,即使这个内容需要分割成100个。

在这次发版中,添加一个可重写的handleOversizedMessage方法,这个方法可以帮助用户使用自己的方法处理容量超限消息。默认情况下,对于容量超限消息,服务端会返回413 Request Entity Too Large 并断开连接。

ChunkedInput and ChunkedWriteHandler

ChunkedInput有两个新方法,progress() 返回当前转换的处理器,length()返回各自流的总长度, ChunkedWriteHandler将会使用这两个信息通知 ChannelProgressiveFutureListener.

SnappyFramedEncoder and SnappyFramedDecoder

这两个类已经被重命名成SnappyFramedEncoderSnappyFramedDecoder,老版本已经被标记成删除,并且老版本实际上是新版本的子类。

Last retrieved on 27-Jul-2018

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 中医理论认为,豆腐味甘性凉,入脾、胃、大肠经,具有益气和中、生津润燥、清热解毒的功效,可用以治疗赤眼、消渴,解硫磺...
    鑫的传说阅读 276评论 0 0
  • 我走在那条早已谙熟于心的小路,充斥着摇滚音乐的耳机隔绝了已暮的世界。 我重复着,这样新奇却枯燥的日子一天又一天...
    0黑羽0阅读 245评论 0 0
  • SOP: Standard Operating Procedure,即标准作业程序,就是将某一时间的标准操作步骤/...
    进击的磨叽酱阅读 792评论 0 3
  • 从前一直以为爱情要么就轰轰烈烈殊死搏杀,要么就相亲相爱永远温和。后来错过了天昏地暗的, 也放走了轻描淡写的,才明白...
    小声儿笑大声儿哭阅读 211评论 0 0