《Netty 实战》第4,5,6章

传送门
《Netty 实战》第1,2,3章
《Netty 实战》第4,5,6章
《Netty 实战》第7,8,9章
《Netty 实战》第10,11章
《Netty 实战》第12,13章

第4章 Netty-传输

  1. 传输迁移
    原始Jdk API(阻塞与非阻塞不统一),NIO接口复杂,而Netty抽象了统一的接口,对OIO和NIO一视同仁.从demo可见仅EventLoopGroup与ServerSocketChannel类型不同.

  2. 传输API-channel

    channel-interfaces.png

    a. channel 关联pipeline和channelConfig
    b. pipeline,一直过滤器模式(Intercepting Filter)
    c. Channel方法

    channel-methods.png

  3. 内置的传输模型


    netty-trans.png

    a. NIO: 默认用的,提供了一个所以I/O操作的全异步实现(netty强大之处),复杂的异步操作由netty实现了,对用户隐藏.
    b. Epoll: 仅linux系统可用的高效nio.

    status-changes.png

    c. Oio: 实际上,netty用异步模拟同步,保证了接口的一致
    d. Local: 用于JVM内部通讯(无demo)
    e. Embedded: 用于测试Handler(第9章)

  4. 传输的用例: 应用程序需求与推荐传输方式

    selected.png

第5章 Bytebuf-Netty数据容器

  1. API(ByteBuf和ByteBufHolder)
    优点:类型扩展,零拷贝,容量增长,无需flip,不同索引,链式调用,引用计数器,池化.

  2. ByteBuf类
    a.工作原理: 维护两个不同索引(readIndex和WriteIndex),用一个Capacity控制容量的增长.
    b. 使用模式: 堆缓冲区(heap),直接缓冲区(derected)-避免内存整理的JVM资源浪费,复合缓冲区(Composite)

  3. 字节级操作:


    ByteBuf.png

    a. 随机访问: 传入索引即可=> getByte(i)
    b. 顺序访问: ?与上面一样啊.
    c. 可丢弃字节( 介于原标签到ReaderIndex之间),可被整理=>discardReadBytes
    d. 可读字节(介于ReaderIndex和WriteIndex之间),readableBytes
    e. 可写字节(介于WriteIndex和Capacity之间),writeableBYtes
    f. 索引管理: mark,reset => clear()仅移动所有,不改内存,比discardReadBytes高效,也更不安全.
    g. 查找操作: forEachByte(传入ByteProcessor)
    h. 派生缓冲区: slice(),相当于一个内存有两套Index,高效(不需重新分配),冲突(无法感知另外一套读写),一般来说生成只读的派生缓冲区还是比较安全的
    i. 读写操作(get/set,read/write)
    j. 其他

  4. ByteBufHolder接口, content(),copy(),duplicate()

  5. ByteBuf分配
    a. ByteBufAllocator接口,与使用模式有关(Pooled和Unpooled)
    b. Unpooled缓冲方法
    c. ByteBufUtil工具类(静态方法调用)

  6. 引用计数ReferenceCounted
    由于ByteBuf可能在堆外,因而Netty需要自行管理缓冲区,使用ReferenceCounted对活动对象的引用进行计数,当被引用的数量为0时,释放内存空间

第6章 ChannelHandler和ChannelPipeLine(重点章节)

channel负责网络连接,ByteBuf负责管理传输的内容,Handler负责处理业务逻辑.

  1. ChannelHandler家族
    a. 生命周期


    channel-life.png

    channel-life2.png

    b. ChannelHandler的生命周期


    channelhander-life.png

    c. ChannelInboundHandler接口


    channelinboundhandler-method.png

    显示资源分配/释放,一些内存位于直接内存,JVM没法管.SimpleChannelInboundHandler会自动释放资源,因此不应该存储指向任何消息的引用.
    d. ChannelOutboundHandler接口


    channeloutboundhandler-method.png

    ChannelPromise是ChannelFuture的子类,只有一次状态变更机会(和JS的一样啊)
    e. ChannelHandler适配器
    基本使用了空实现,继承时只需要关心要覆盖的方法
    f. 资源管理
    Netty使用引用计数器来处理池化的ByteBuf,因此调整引用计数器来管理对应的内存资源.
    启动时:-Dio.netty.leakDectectionlevel=ADVANCED进行泄露检测.
    入站消息被消费后,就不会传给下个InboundHandler了.
    出站wreite后就需要release了,不应该在传给下个OutboundHandler了.

  2. ChannelPipeline接口:
    channel与其Pipeline是在创建的时候关联的,无法改变.只能该Pipeline中的Handler.在Pipeline中传递消息时候,会自动判断下一个类型和事件方向是否匹配,不匹配自动跳过


    pipeline-handler.png

    a. 修改ChannelPipe的API


    pipeline-methods.png

    由于Handler是在EventLoop线程中运行的,所以千万不要编写阻塞代码,否则整个Netty性能都受影响.如果有遗留代码,可以使用EventExecutorGroup新建线程(同样开销大).
    b. 事件触发
    出站/入站都有对应的fire××()方法,调用pipeLine向下个Handler流动.

  3. ChannelHandlerContext
    ctx是Handler和Pipeline之间的关联,与Handler一一对应,从AbstractChannelHandlerContext可知,有prev,next,构成链条的地方.
    a. ChannelHandlerContext使用


    channel-relations.png

    实际上Channel或channelPipeLine上的事件是通过ChannelHandlerContext上调用完成的(整个链传播),而直接调用ctx可更加精细控制,只传播到下一个Handler.


    ctx-eventline.png
  4. 异常处理:
    a. 入站异常,也会继续流动,直到Pipeline链有人caught处理
    b. 出站异常,返回ChannelFuture->channelFutureListener,关心处理结果的自行判断处理

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

推荐阅读更多精彩内容