ByteBuf
JDK原生ByteBuffer的外围性能
- 字节缓冲区,次要对字节进行操作的一个类
- 可能将缓冲区建设在堆内和堆外。一般的new byte[] ,都只是建设在堆内
Netty之所以要本人封一套ByteBuf的次要起因是:
- 原生ByteBuffer 容量固定,一旦调配不能动静扩容和膨胀。
- 原生ByteBuffer 的API应用不够优雅。稍有不慎,应来源gaodai.ma#com搞#代!码网
用将会出错。它有3个外围指针,别离为position、 limit、capacity 。position : 地位,示意缓冲区中正在操作数据的地位。limit : 界线,示意缓冲区中能够操作数据的大小,(limit 后数据不能进行读写) capacity : 容量。读写须要调用flip()、rewind()、clear()等办法来挪动相干指针 。
ByteBuf 呢?它应用了外围的两个地位指针来帮助读写操作java培训,别离为readerIndex和writerIndex,数据读取readerIndex会减少,数据写入writerIndex会减少,不须要减少额定的操作来挪动相干指针。此外 readerIndex 是不可能超过 writerIndex。读取过 的 0 ~ readerIndex 这部分空间是被视为弃用的,同时它能够进行主动扩容。
Channel
Channel 是网络操作抽象类,聚合了一组性能,提供了比原生Java SocketChannel、ServerSocketChannel大而全的性能接口,供业务开发者应用,包含但不限于网络的读、写、发动连贯、敞开连贯、获取通信单方的地址。
UnSafe
Channel 的辅助操作类,操作底层网络I/O,都是由它负责实现。
ChannelPipeLine
是Channel数据管道的一个形象,音讯在ChannelPipeLine中流动和传递。它依据I/O事件的类型,将消息传递给ChannelHandler进行解决。同时对ChannelHandler链表进行治理和调度。在读取数据时,ChannelHandler链表的调度程序是ch1,ch2,ch3,写数据时调度程序为ch3,ch2,ch1。能够说它是ChannelHandler的一个治理容器。
ChannelHandler
解决相应I/O事件的通道音讯处理器,比方,读事件、写事件、读实现事件、写实现事件等,Netty中泛滥的编解码器等都是实现自 ChannelHandler。
ChannelHandlerContext
通道处理器上下文,通过它来实现Channel 、ChannelPipeline、ChannelHandler这几个组件之间的交互,采纳常识最小化准则让每个组件只关怀ChannelHandlerContext相干API,。
ok,咱们来大抵梳理一下对于通道的几个外围类关系。
- 每个Channel会绑定一个ChannelPipeline,ChannelPipeline中也会持有Channel的援用
- ChannelPipeline持有ChannelHandlerContext链路,保留ChannelHandlerContext的头尾节点指针
- 每个ChannelHandlerContext会对应一个ChannelHandler,也就相当于ChannelPipeline持有ChannelHandler链路
- ChannelHandlerContext同时也会持有ChannelPipeline援用,也就相当于持有Channel援用
NioEventLoopGroup
Netty遵循Reactor根底线程模型的一个具体实现。以下是Reactor几种根底线程模型介绍。
Reactor 单线程模型,所有的I/O操作都在同一个线程上实现。
Reactor多线程模型,有一个用于专门接管客户端TCP连贯的NIO线程,网络I/O 读、写操作有专门一个NIO线程池解决。
主从Reactor多线程模型,专门接管客户端TCP连贯的不在是一个线程,而是一个独立的线程池(主),网络I/O 读、写操作依然是专门一个NIO线程池解决(从)