netty

作者: go_2021 | 来源:发表于2022-02-11 17:45 被阅读0次
基本流程

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。

零拷贝
  1. 接受和发送的数据,用DirectByteBuffer存储(MappedByteBuffer升级版,之前只能到full GC才能回收,新的可以代码控制回收),mmap技术减少读时用户空间到内核空间数据的copy。
  2. 文件传输采用transferTo。
  3. byte[] 数组、ByteBuf、ByteBuffer等包装成一个 Netty ByteBuf 对象,多个 Netty ByteBuf对象又包装成了CompositeByteBuf

相关文章

网友评论

      本文标题:netty

      本文链接:https://www.haomeiwen.com/subject/zbsakrtx.html