目录
简介
1、非阻塞、异步
基础组件
一、Channel
传入和传出数据的载体,是线程安全的
二、ChannelFuture
所有属于同一个Channel的操作都被保证其将以它们被调用的顺序被执行
三、回调
四、事件
事件/任务是按照先进先出(FIFO)的顺序执行的,从而保证了字节内容按正确顺序处理。
五、ChannelHandler
- 事件的回调,实现了应用程序用于处理状态变化以及事件处理的逻辑。
- 处理入站和出站数据应用程序逻辑
- ChannelHandler可以属于多个ChannelPipeline,但是要用@Sharable标签标记,ChannelHandler必须是线程安全的。
六、EventLoop
会为每个 Channel 分配一个 EventLoop,用以处理连接生命周期所发生的事情。
- 一个 EventLoopGroup 包含一个或者多个 EventLoop
- 一个 EventLoop 在它的生命周期内只和一个Thread绑定
- 所有由EventLoop处理的io事件都将在它专有的Thread上被处理
- 一个channel在它的生命周期内只注册于一个EventLoop
- 一个EventLoop可能会被分配给一个或多个Channel
非阻塞IO线程模型
阻塞IO线程模型
接口继承关系
七、ChannelPipeline
提供了 ChannelHandler 链的容器,并定义了用于在入站和出站事件流的API
ChannelHandler 安装到 ChannelPipeline 中的过程
- 一个ChannelInitializer的实现被注册到了ServerBootstrap中
- 当ChannelInitializer.initChannel方法被调用时,ChannelInitializer将在ChannelPipeline中安装一组自定义的ChannelHandler;
- ChannelInitializer将它自己从ChannelPipeline中移除
每一个新创建的Channel都会被分配一个新的ChannelPipeline ,不能附加另一个ChannelPipeline也不能分离当前的。
阻塞方法使用DefaultEventExecutorGroup
八、ChannelHandlerContext
- 代表ChannelHandler和ChannelPipeline之间的绑定,且永远不会改变,所以缓存对ChannelHandlerContext的引用是安全的。
- 用于 将事件从一个ChannelHandler传递到下一个ChannelHandler,主要还是被用于写出站数据。
- 每当有ChannelHandler添加到ChannelPipeline中时都会创建ChannelHandlerContext。
- 产生更短的事件流(调用的方法只会传递到下一个ChannelHandler),所以可以通过提升性能
九、引导
Bootstrap
ServerBootstrap
从Channel引导客户端
ChannelOption
知识点
- 如果使用多个ChannelHandler,请使用ChannelInitializer,ChannelInitializer 可以向ChannelPipeline动态添加handeler;ChannelInitializer<Channel/SocketChannel>
- bossGroup, 用于处理客户端的连接请求; 另一个是 workerGroup, 用于处理与各个客户端连接的 IO 操作.
- 引导DatagramChannel,无连接协议不动用connent()只调用bind()
- 将ChannelOption用于引导,从而用于Channel
- AttributeMap<Channel,引导>
- AttributeKey:插入或获取属性值的泛型类
- 关闭:记得关闭EventLoopGroup,shutdownGracefully()该方法是异步的。
十、ByteBuf
1、堆缓冲区、直接缓冲区、复合缓冲区
2、索引
- get*操作不会移动readerIndex
- 任何read和skip开头的操作会检索或跳过位于当前readerIndex的数据,并增加已读字节
- readBytes(ByteBuf dest)该目标的缓冲区的writerIndex将被增加;
- clear()方法将 readerIndex 和 writerIndex 设为 0,但不会清除内存中的内容。
- clear()比 discardReadBytes()轻量,discardReadBytes可以丢弃已读字节回收空间。
- 查找:forEachByte(ByteBufProcessor.FIND_NUL);indexOf();
- 派生缓冲区(非独立副本):slice(int, int) Unpooled.unmodifiableBuffer(…) order(ByteOrder) readSlice(int) duplicate() slice();
- 独立副本使用:copy()
- ByteBufHolder:缓冲区池化,用于存储属性值;
- PooledByteBufAllocator:池化,减少内存碎片
- UnpooledByteBufAllocator:返回新的ByteBuf实例
- Unpooled:静态方法获得未池化的ByteBuf
- ByteBufUtil:静态方法hexdump()和equal方法等
关系整合
内置传输
NIO
OIO
支持的协议
其它
出站:客户端到服务端
入站:服务端到客户端
ReferenceCountUtil.release(msg);释放消息