Netty 源码剖析与实战
傅健
Netty 源码贡献者、Cisco 高级软件工程师
32935 人已学习
新⼈⾸单¥59
课程目录
已完结/共 60 讲
第一章:初识Netty:背景、现状与趋势 (7讲)
第三章:Netty源码:从“线”(请求处理)的角度剖析 (8讲)
第六章:成长为Netty的贡献者 (6讲)
Netty 源码剖析与实战
登录|注册
留言
20
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 36 | Netty编码中易错点解析
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 揭开Netty面纱
04 | 为什么舍近求远:不直接用JDK NIO?
05 | 为什么孤注一掷:独选Netty?
06 | Netty的前尘往事
07 | Netty的现状与趋势
08 | Netty怎么切换三种I/O模式?
09 | 源码剖析:Netty对I/O模式的支持
10 | Netty如何支持三种Reactor?
11 | 源码剖析:Netty对Reactor的支持
12 | TCP粘包/半包Netty全搞定
13 | 源码剖析:Netty对处理粘包/半包的支持
14 | 常用的“二次”编解码方式
15 | 源码剖析:Netty对常用编解码的支持
16 | keepalive与idle监测
17 | 源码剖析:Netty对keepalive与idle监测的支持
18 | Netty的那些“锁”事
19 | Netty如何玩转内存使用
20 | 源码解析:Netty对堆外内存和内存池的支持
21 | Netty代码编译与总览
22 | 源码剖析:启动服务
23 | 源码剖析:构建连接
24 | 源码剖析:接收数据
25 | 源码剖析:业务处理
26 | 源码剖析:发送数据
27 | 源码剖析:断开连接
28 | 源码剖析:关闭服务
29 | 编写网络应用程序的基本步骤
30 | 案例介绍和数据结构设计
31 | 实现服务器端编解码
32 | 实现一个服务器端
33 | 实现客户端编解码
34 | 完成一个客户端雏形
35 | 引入"响应分发"完善客户端
36 | Netty编码中易错点解析
37 | 调优参数:调整System参数夯实基础
38 | 调优参数:权衡Netty核心参数
39 | 调优参数:图解费脑的三个参数
40 | 跟踪诊断:如何让应用易诊断?
41 | 跟踪诊断:应用能可视,心里才有底
42 | 跟踪诊断:让应用内存不“泄露”?
43 | 优化使用:用好自带注解省点心
44 | 优化使用:“整改”线程模型让"响应"健步如飞
45 | 优化使用:增强写,延迟与吞吐量的抉择
46 | 优化使用:如何让应用丝般“平滑”?
47 | 优化使用:为不同平台开启native
48 | 安全增强:设置“高低水位线”等保护好自己
49 | 安全增强:启用空闲监测
50 | 安全增强:简单有效的黑白名单
51 | 安全增强:少不了的自定义授权
52 | 安全增强:拿来即用的SSL-对话呈现表象
53 | 安全增强:拿来即用的SSL-抓包暴露本质
54 | 安全增强:拿来即用的SSL-轻松融入案例
55 | Cassandra如何使用Netty ?
56 | Dubbo如何使用Netty ?
57 | Hadoop如何使用Netty ?
58 | 赏析Netty之美
59 | 如何给Netty贡献代码?
60 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(20)

  • 最新
  • 精选
学习
老师,handler的顺序那里还是没太懂,为什么两个encodeHandler放在frameDecodeHandler后面呢

作者回复: 读保证自上而下,写保证自下而上就行了,读与写之间其实顺序无所谓,但是一般为了好看对称,我们是一组一组写。案例中的顺序功能是没有问题的,只是让你产生了疑惑。 你提出的这个不懂,我觉得我可以改下,但是如果我改了,或许你就没有这个问题了,哈哈,所以我要考虑下好看与教学效果之间做个平衡。

2019-12-08
2
9
夷,这也可以
老师,我问个比较业余的问题,因为你这个案例完全是基于tcp协议来的,所以第一次和第二次编解码也是自定义。客服端和服务端都是必须是同一套编解码。netty对其他协议的支持(http、mqtt等)就是根据消息协议的格式约定,实现数据的第一次和第二次编解码。当然也可能把第一次和第二次统一封装成一个编码类方便api调用。不过底层数据传输走的还是这几个步骤。也就是netty都可以看做4+1的处理方式来实现各种协议的网络传输处理。不知道理解的对不对?

作者回复: 对于tcp大多如此的,但是有一种情况,就是如果你接受到数据,立马就转走,像路由器一样,那这个时候,你的处理就不需要那么多层次的编解码了,因为你不做处理,只是二转手,就像快递员一样,不会拆你的快递一样,就是给你转走; 不是这种情况下,大多都需要4+1, 4是2组:1组处理粘包:1组处理转化给用户好用/存储。最后那个1业务处理。

2019-11-17
2
3
zpzeng
老师,对于channelHandler是否共享有没有什么一般性原则,判断依据。我感觉demo里Server端的几个Handler都没有对传入的参数引用做保存,修改操作,我觉得并发没问题,那是不是就可以全部都共享。

作者回复: 你这个感觉很好,我也是这么判断的,除了这点之外,你分2种情况看:别人写的和自己要写的,如果是别人写的,你看它可标记成@sharable了。如果自己写的,自己最清楚了,主要看可有线程安全和是否符合自己的需求,比如你统计整个系统的,一般都要做成共享的,如果你统计单一连接的,你肯定就是非共享的,不管用哪种方式去看,自己去实际分析代码最准确。其中就有你说的那个小方法,就是看那个类可有成员变量,如果一个没有,十有八九都可以共享。

2019-11-16
2
鱼向北游
感觉channel.writeandflush也挺常见呀,有时候接的消息为了解耦是直接放队列,然后消费调rpc,等rpc返回的时候一般找的都是channel呀,再用writeandflush写出去,好像那时候就没ctx了

作者回复: 客户端常见,服务器端见的少些,还是看具体需求,但是一定要搞清楚两者之间区别,否则要不多绕了一圈,要不就搞出问题了。当然有很多时候也不出问题,这里列出来的意思就是让大家要搞清楚这两个不一样,写的时候,小心点,如果用好了,能节约调用。

2019-11-15
3
2
zhangtnty
对于老师的示例,还有个非常不起眼但很难排查到的错误: 示例里定义的:MessageConfigFrameDecoder,MessageConfigFrameEncoder,MessageConfigProtocolEncoder,MessageConfigProtocolDecoder这四个类在Client端和Server端名称一致,会造成:Client端用了Server端的,Server端用了Client端的。结果是启动Client时无任何报错,在Server端就是收不到Read信息,所以还是建议对应名称应该有所区分。

作者回复: 嗯,确实容易误导入。以前我也犯过类似的错:很多JAR立马的类名字一样,有天选错了.....

2021-08-02
1
Gary
老师您好,为什么注册时inboundhandler中夹着outboundhandler,不是先写完inboundhandler再写outboubdhandler?

作者回复: 这个问题很好,其实是风格问题,你说的那样也可以,但是现在大多都是按照我那样的写法写,因为体现一对一对的感觉,很清晰,如果按照你想要的那种写法,其实让别人看到的是那种业务逻辑处理的感觉了,然后读者还要去读去找,看看你是不是一对一对的了。

2019-11-14
3
1
yang
之前看到第二章编解码就坚持不下去了。 看到评论又重新从第四章开始看,第四张看是看完了。 先跟着老师把第四张做完,再继续其他。 前三章需要实践一些再去看,会更有效果。 无论如何,老师讲的很好,加油!

作者回复: 加油,主要还是自己练习一遍。不然貌似懂了不定真正理解的。

2020-03-23
密码123456
看完了一章,然后一口气行云流水写下来。写了1小时。调试4小时。::>_<::

作者回复: 速度还可以!

2020-02-14
AAA
老师,handler顺序问题是不是处理请求的时候是顺序处理响应是倒序的,因为处理请求的时候是先拼装消息体再Encode,而处理响应是先Decode再解析消息体,是这样吗?

作者回复: 你这样说不是割裂了请求处理和响应了么?而且你说的不对吧。 请求是先解码,解出最终的业务请求,然后执行,然后再编码,作为响应发送回去。 就像在U型滑道上单向玩板车一样,是一个连续的过程。

2020-01-02
虹炎
老师我问的第三个问题,如果我发送数据的数据长度length写为1000byte,实际传数据100个byte. netty怎么处理这种传输的数据呢? 我第一次发送数据是故意这样做,第二次以后,就发送正确的数据,netty是不是就会报错了,如果用LengthFieldBasedFrameDecoder。netty怎么处理,别人知道协议后,故意发送这种不符合要求的数据攻击呢。

作者回复: 参考这个实现:io.netty.handler.codec.LengthFieldBasedFrameDecoder#decode(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf) 首先,你这样做,netty不知道你是故意的,所以他认为这个数据还没有传完,所以会等你第二个正确的数据过来的时候,把你第二个数据(或部分,反正一共900字节)合并前面的100字节当第一个数据来处理,说是处理,还是传给你业务层,这个时候,一般你肯定会出错的(比如你做json解析肯定抛异常了),因为这个数据不是完整正确的。所以这个时候下步怎么走,要看你的io.netty.channel.ChannelHandler#exceptionCaught 怎么实现了。 这种情况,很难恢复回来了,所以可以直接在这个方法的实现中,直接把连接断掉。 你后面的问题,所以你要做授权(后面一章的内容)等防范,如果都授权过了。那别人就没有机会来发送这种数据。

2019-12-31
收起评论