美文网首页Java学习笔记
Netty实战阅读笔记

Netty实战阅读笔记

作者: WANGGGGG | 来源:发表于2019-04-08 19:27 被阅读2次

1.Netty的组件和设计

1.1 Channel接口

Netty的channel接口提供的api大大的降低了直接使用Socket类的复杂性,Channel拥有许多预定义的、专门化实现的广泛类层次结构的根,如:
EmbeddedChannel:是netty专门改进针对ChannelHandler的单元测试而提供的。
LocalServerChannel:是用来进行local传输的
NioDatagramChannel:是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包。
NioSctpChannel:异步的客户端 Sctp 连接
NioSocketChannel:非阻塞式Socket传输

1.2 EventLoop接口

一个EventLoopGroup包含一个或多个EventLoop,一个EventLoop在生命周期内只和一个thread绑定,由thread处理I/O事件,一个EventLoop里面可以注册一个或多个Channel。在这种设计中,一个给定Channel的I/O操作都是由相同的Thread执行的,实际上消除了对于同步的需要。

1.3 ChannelFuture接口

ChannelFuture接口的addListener()方法注册了一个ChannelFutureListener,以便在某个操作完成时得到通知。

1.4ChannelPipeLine接口

数据流在PipeLine中通过ChannelInboundHandler和ChannelOutboundHandler(两者均是ChannelHandler子类)传输,在两种handler中可以增加数据流的业务处理。

2.传输

ChannelHandler用途:将数据从一种格式转换为另外一种格式,提供异常通知,提供Channel变为活动的或者非活动的通知,提供当Channel注册到EventLoop或者从EventLoop注销时的通知,提供有关用户自定义事件的通知。

3.ByteBuf

3.1优势

(1)它可以被用户自定义的缓冲区类型扩展
(2)通过内置的复合缓冲区类型实现了透明的零拷贝
(3)容量可以按需增长(类似于JDK的StringBuilder)
(4)在读和写使用了不同的索引
(5)支持方法的链式调用
(6)支持引用计数
(7)支持池化

3.2工作原理

ByteBuf维护了两个不同的索引,一个用于读取,一个用于写入,以read或者write开头的ByteBuf方法将会推进对应的读或者写的索引,但是set和get操作不会。因为有两个索引,因此不需要调用flip()方法来切换读写模式。
三种缓冲模式:(1)最常用的ByteBuf模式是将数据存储在JVM的堆空间中,这种模式成为支撑数组,它能在没有使用池化的情况下快速的分配和释放;(2)直接缓冲区是另外一种ByteBuf模式,因为JDK1.4中引入的ByteBuffer允许JVM实现通过本地调用来分配内存,可以避免在每次调用本地I/O操作之前或者之后,将缓冲区的内容复制到一个中间缓冲区,或是从中间缓冲区复制到缓冲区。(3)复合缓冲区,ByteBuf子类CompositeByteBuf实现了这个模式,它可以使用直接缓冲区,减少复制操作,也利用了堆缓冲区,可以重复利用一些数据,减少分配和释放的操作
直接缓冲区的优缺点:a.网络应用中,数据在通过套接字发送它之前,JVM将会在内部把缓冲区内容复制到直接缓冲区中,所以直接使用缓冲区可以绕开这个复制的操作;b.但是在平常应用中,相较于基于堆的缓冲区,它的分配和释放都比较昂贵,有时候因为数据不在堆上,甚至需要将直接缓冲区的数据复制到堆上在做处理。

4.NIO多路复用器Selector

selector简称多路复用器,它是JAVA NIO编程的基础简单来讲,selector会不断轮询注册在其上的channel,如果某个channel上面发生了读或者写事件,这个channel就会处于就绪状态,会被selector轮询出来,然后通过selectorKey可以获取就绪channel的集合,进行后续的io操作。

后面的内容看不下去了,还不如自己看源码

相关文章

网友评论

    本文标题:Netty实战阅读笔记

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