Netty 源码剖析与实战
傅健
Netty 源码贡献者、Cisco 高级软件工程师
32935 人已学习
新⼈⾸单¥59
课程目录
已完结/共 60 讲
第一章:初识Netty:背景、现状与趋势 (7讲)
第三章:Netty源码:从“线”(请求处理)的角度剖析 (8讲)
第六章:成长为Netty的贡献者 (6讲)
Netty 源码剖析与实战
登录|注册
留言
23
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 24 | 源码剖析:接收数据
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 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(23)

  • 最新
  • 精选
冬渐暖
读数据技巧:1.和省内存一样,提前猜测下一次要装的大小 2.一直读到没有或者别人不满意为止(贪心) 读数据:接收OP_READ事件,然后对数据进行处理 处理这些数据的流程:1.创建个初始化为1024的byteBuffer来装channel的数据,如果没装够就记下这一次的,想下下次要分配的大小(allocHandle有个guess和reset的方法) 2.触发pipeline.fireChannelRead(byteBuf)把读取到的数据传播出去,将事件开始在pipeline中传递。如果读完了的话就跑路,没有的话就扩容来继续把数据读到没有或者直到读了16次(给别人机会) 需要注意的地方是:1.scoket是可以使一个应用从网络中读取和写入数据;ServerSocket是等待客户端的请求,一旦获得一个连接请求,就创建一个Socket示例来与客户端进行通信。 所以NioServerSocketChannel read()是创建连接,NioSocketChannel read()是读数据, 2.一次OP_READ事件可能有多个读数据传播操作 我的疑问是,alloc自适应大小不是发生在每次读完之后根据有没有读满才扩容吗?应该只有扩容没有缩小啊。。。。难道是这次读完了之后,如果连续两次都发现自己没满,就缩小吗?这个缩小的比例又是多少。。。 我发现取下次大小是按照maxBytesPerIndividualRead和本次读的大小 两者的最小值,但是maxBytesPerIndividualRead我没看到赋值的地方(maxBytesPerReadPair方法和maxBytesPerIndividualRead方法)有被其它地方引用到啊 你说的雨露均沾,我还是没明白为什么是16次最优,不是其它的2的幂次方倍??

作者回复: 1 你估计看错了类,所以你没有看懂,你看的那个类估计是DefaultMaxBytesRecvByteBufAllocator 所以我用中文注释了过那个类: “//无人调用,加一个@Deprecated标识下” 2 io.netty.channel.AdaptiveRecvByteBufAllocator.HandleImpl#readComplete会尝试缩小,缩小比例不完全一样(以512为界限,有2种):一种是减小1倍,一种是减小16 3 "什么是16次最优,不是其它的2的幂次方倍?"我意思这个本身不是问题,因为写32的话,别人也会问为什么不是16,“雨露均沾”是说给别人读的机会,所以要控制中的次数。 你每次笔记记得挺细致的,哈哈

2019-12-05
7
公号-彤哥读源码
老师,我想问下,如何实现当客户端建立连接的时候服务端立马主动给客户端发送一个消息?而不是等客户端发送消息之后再发送消息。我举个例子,比如聊天室系统,当某人加入聊天室的时候立马给他发送一条欢迎消息,这时候客户端还没有发送任何消息,只建立了连接。

作者回复: 直接在已有的handler里或者新的handler里,实现channelActive这个方法:调用ctx带的write方法写欢迎信息。

2019-12-26
3
姚远
老师 我想请问一下 pipeline.fireChanlRead(byteBuf)方法的意义是啥呢 一次读取可能不能把所有客户端发送的内容都读到呀。传播下去pipeline里的handlers 也处理不了呀

作者回复: 一次可能读到多个完整的消息,所以传下去有必要,这样至少前面完整的消息能及时处理,一次也可能读不完,传下去也没必要,一方面,后面的处理器会帮你存起来这些半包数据,另外你可以写一些处理器做些别的事情,总体思想还是有数据就往外扔,而不是死等着,因为这是一个数据流,等意义也不大

2019-10-30
3
3
Sonny721
老师您好,每次读取1024个大小数据,读取16次,如果发送的数据大于1024*16,多余数据丢失了?

作者回复: 不会的,后面的数据还会触发读事件,继续新的一波读取。

2020-02-13
3
2
NoBody
硬着头皮用了下班时间花了三天,看了这三节的源码,然后自己走了好多好多次。终于有点大概的概念了。过程太艰难了。现在好点了。

作者回复: 嗯,多搞搞就好了,搞到最后,大家都还是不是完全懂的,但是都会好点的,包括我自己也是这样。所以你放心加油搞吧。哈哈

2020-03-19
密码123456
同一个连接,对多次读事件怎么并发处理的?

作者回复: 丢到一个独立的线程池去做,不然都是顺序处理的了,怎么单独线程池,第五章会介绍,到时候您在看看,有问题再沟通。谢谢

2020-02-09
密码123456
有个问题,如果读了16次还没有读完。怎么办?

作者回复: 不读完,还会触发读事件的,所以还是能处理到的,只是说把这次机会(否则一直读下去,别的连接就没有什么机会读到了)让出去了。

2020-02-09
2
我已经设置了昵称
老师这节课讲的比较好,现类比现实中的场景,再介绍源码。很容易理解

作者回复: 嗯,那就好,有些节就不能完全做到,只能说尽量做到如此,谢谢!

2020-01-19
成都小郭
老师,我在线上遇到了netty读取数据延迟很高,几秒到十几秒。。排查了一下,怀疑是服务器聊天类消息推送过多,导致io线程被占用,一直执行写事件。。请问我这个分析有问题吗,另外除了优化推送次数,还有什么优化手段吗

作者回复: 可以查看下你的线程模型有没有问题(后面的第五章也会提及,IO型的业务要独立出线程池),然后这个问题需要查很多因素,具体可以 参考上次做直播的ppt说到的一个类似问题(第九个问题): https://github.com/geektime-geekbang/geek_netty/ 如果还有疑问,或者不清楚,可以继续提个问题。谢谢

2019-12-04
2
南秋同学
老师解析源码非常的细致,赞! 有一个疑问:如果Channel或者说Pipeline中的所有Handler都执行完了,会重新注册可读事件(OP_READ)吗?或者说处理完后是怎么处理的?

作者回复: 一般情况(你问的情况),op_read一直注册在,不是重新注册,也不需要重新注册。重新注册的场景是出现在自己主动取消读监听后,又重新注册时,比如流量整形的读暂停到读恢复。正常没有开启各种复杂特性时都是一直注册在,所以只要有数据,就自动处理各种handler。

2019-12-04
收起评论