Netty知识点
2021-07-20 15:15:54 63 举报
AI智能生成
Netty知识点
作者其他创作
大纲/内容
Netty逻辑架构
事件调用层
服务编排层:channelPipeline组装ChannelHandler<br>
ChannelHandlerContext封装重复的connent、bind、read、flush等操作<br>
网络通信层
Netty组件关系梳理<br>
事件处理机制
ByteBuf<br>
JDK的byteBuffer缺陷<br>
1.分配长度固定,无法扩缩容;<br>2.读写共用position指针,需要频繁切换读写状态;<br>
1.容量按需扩容;<br>2.读写双指针;<br>3.实现零拷贝;<br>4.支持引用计数;<br>5.支持缓存池;<br>
轻量级对象回收站:Recycler对象池<br>
Netty相比Java NIO
易用性:更友好的API,更好的上层抽象,降低上手难度,提供了很多开箱即用的工具<br>
稳定性:解决了NIO中的一些问题,如select空轮询、TCP断连、keep-alive检测等问题<br>
可扩展性:<br>1.可定制化的线程模型:reactor线程模型<br>2.可扩展的事件驱动模型:业务层与框架层分离,开发者只需关注ChannelHandler的业务逻辑实现<br>
更低的资源消耗:对象池技术,减少GC压力<br>
零拷贝:避免了数据从堆外内存和堆内存之间的拷贝<br>
Netty整体架构<br>
Subtopic
线程模型
单线程模型
多线程模型
业务逻辑交给线程池执行,如读取数据还是串行化执行<br>
主从线程模型(推荐)<br>
MainReactor仅负责处理客户端的accept事件,连接成功后交给subReactor,<br>再由subReactor分配线程池中的IO线程执行IO生命周期的所有事件<br>
编解码
定长消息<br>
特定分隔符
消息长度+消息内容<br>
高性能内存管理
零拷贝<br>
Linux零拷贝
原始拷贝
优化版(DMA引擎)<br>
进阶版(DMA引擎)
Netty的零拷贝:除了linux的零拷贝以外,Netty优化了面向用户态的数据操作<br>
堆外内存,避免 JVM 堆内存到堆外内存的数据拷贝。<br>
CompositeByteBuf 类,可以组合多个 Buffer 对象合并成一个逻辑上的对象,<br>避免通过传统内存拷贝的方式将几个 Buffer 合并成一个大的 Buffer。<br>
通过 Unpooled.wrappedBuffer 可以将 byte 数组包装成 ByteBuf 对象,包装过程中不会产生内存拷贝<br>
ByteBuf.slice 操作与 Unpooled.wrappedBuffer 相反,slice 操作可以将一个 ByteBuf 对象切分成多个 ByteBuf 对象,<br>切分过程中不会产生内存拷贝,底层共享一个 byte 数组的存储空间<br>
Netty 使用 FileRegion 实现文件传输,FileRegion 底层封装了 FileChannel#transferTo() 方法,<br>可以将文件缓冲区的数据直接传输到目标 Channel,避免内核缓冲区和用户态缓冲区之间的数据拷贝,这属于操作系统级别的零拷贝<br>
0 条评论
下一页