基本流程
bossEventLoop 监听端口,监听accept
事件,创建连接之后创建channel
绑定到workEventLoop
。
workEventLoop 监听channel
上的读写事件,交给works
线程执行。
重要组件
ChannelPipeline,每个channel
一个双向链表。
handler具体操作干活的。
责任链
每个channel
有个Pipeline
,维护了个双向handler
链表。
读事件从头到尾,执行in
类型的handler
方法。
写事件从尾到头,执行out
类型的handler
方法。
干啥的,和tomcat有啥区别
可以简单理解为封装了java的io和nio模型,方便调用。(dubbo,rocketMq)
实现了应用层协议的封装,有各种解决粘包的方法。
tomcat是针对http的,netty是对多协议的。tomcat,nio有arp模式,性能很高。
空轮询bug修复
while(true){
selector.select()
处理事件..唤醒之后又啥也不干..然后不断轮询,导致cup占满
}
netty和jetty的解决思路是,记录阻塞时间和一个计数,阻塞时间太短计数加一,计数到512时,重新创建selector。
零拷贝
- 接受和发送的数据,用DirectByteBuffer存储(MappedByteBuffer升级版,之前只能到full GC才能回收,新的可以代码控制回收),mmap技术减少读时用户空间到内核空间数据的copy。
- 文件传输采用transferTo。
-
byte[] 数组、ByteBuf、ByteBuffer
等包装成一个 Netty ByteBuf 对象,多个Netty ByteBuf
对象又包装成了CompositeByteBuf
。
网友评论