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