首先解释一下Netty的零拷贝体现在何处?
Netty的零拷贝主要体现在三个方面:
第一种实现:DirectByteBuf 直接内存缓冲区
就如上所说,ByteBuf可以分为HeapByteBuf和DirectByteBuf,当使用DirectByteBuf可以实现零拷贝
第二种实现:CompositeByteBuf 复合缓冲区
CompositeByteBuf将多个ByteBuf封装成一个ByteBuf,对外提供封装后的ByteBuf接口
第三种实现:DefaultFileRegion
DefaultFileRegion是Netty的文件传输类,它通过transferTo方法将文件直接发送到目标Channel,而不需要循环拷贝的方式,提升了传输性能
为什么Netty使用NIO而不是AIO?
- Netty不看重Windows上的使用,在Linux系统上,AIO的底层实现仍使用EPOLL,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层不容易深度优化
- Netty整体架构是reactor模型, 而AIO是proactor模型, 混合在一起会非常混乱,把AIO也改造成reactor模型看起来是把epoll绕个弯又绕回来
- AIO还有个缺点是接收数据需要预先分配缓存, 而不是NIO那种需要接收时才需要分配缓存, 所以对连接数量非常大但流量小的情况, 内存浪费很多
- Linux上AIO不够成熟,处理回调结果速度跟不到处理需求,比如外卖员太少,顾客太多,供不应求,造成处理速度有瓶颈(待验证)
Netty线程模型
服务端线程模型
第一步:从用户线程起发起创建服务端操作,代码如下:【用户线程创建服务端代码示例】
NioEventLoopGroup boss=new NioEventLoopGroup(1);
NioEventLoopGroup worker=new NioEventLoopGroup();
try {
//服务端启动辅助类,主要作用就是将接收连接和用户逻辑处理相关的配置进行初始化
ServerBootstrap bootstrap=new ServerBootstrap()
//将主/工作EventLoopGroup进行配置
.group(boss,worker