Netty体系结构

目录

简介

基础组件

一、Channel

二、ChannelFuture

三、回调

四、事件

五、ChannelHandler

六、EventLoop

非阻塞IO线程模型 

阻塞IO线程模型 

接口继承关系 

七、ChannelPipeline

八、ChannelHandlerContext

九、引导

Bootstrap

ServerBootstrap 

知识点

十、ByteBuf

关系整合

内置传输

NIO

OIO

支持的协议 

其它


简介

1、非阻塞、异步

基础组件

一、Channel

传入和传出数据的载体,是线程安全的

二、ChannelFuture

所有属于同一个Channel的操作都被保证其将以它们被调用的顺序被执行

三、回调

四、事件

事件/任务是按照先进先出(FIFO)的顺序执行的,从而保证了字节内容按正确顺序处理。

五、ChannelHandler

  • 事件的回调,实现了应用程序用于处理状态变化以及事件处理的逻辑。
  • 处理入站和出站数据应用程序逻辑
  • ChannelHandler可以属于多个ChannelPipeline,但是要用@Sharable标签标记,ChannelHandler必须是线程安全的。

六、EventLoop

会为每个 Channel 分配一个 EventLoop,用以处理连接生命周期所发生的事情

  • 一个 EventLoopGroup 包含一个或者多个 EventLoop
  • 一个 EventLoop 在它的生命周期内只和一个Thread绑定
  • 所有由EventLoop处理的io事件都将在它专有的Thread上被处理
  • 一个channel在它的生命周期内只注册于一个EventLoop
  • 一个EventLoop可能会被分配给一个或多个Channel

Netty体系结构_第1张图片

非阻塞IO线程模型 

Netty体系结构_第2张图片

阻塞IO线程模型 

Netty体系结构_第3张图片

接口继承关系 

Netty体系结构_第4张图片

七、ChannelPipeline

提供了 ChannelHandler 链的容器,并定义了用于在入站和出站事件流的API

ChannelHandler 安装到 ChannelPipeline 中的过程

  • 一个ChannelInitializer的实现被注册到了ServerBootstrap中
  • 当ChannelInitializer.initChannel方法被调用时,ChannelInitializer将在ChannelPipeline中安装一组自定义的ChannelHandler;
  • ChannelInitializer将它自己从ChannelPipeline中移除

Netty体系结构_第5张图片

每一个新创建的Channel都会被分配一个新的ChannelPipeline ,不能附加另一个ChannelPipeline也不能分离当前的。

阻塞方法使用DefaultEventExecutorGroup

八、ChannelHandlerContext

  • 代表ChannelHandler和ChannelPipeline之间的绑定,且永远不会改变,所以缓存对ChannelHandlerContext的引用是安全的。
  • 用于 将事件从一个ChannelHandler传递到下一个ChannelHandler,主要还是被用于写出站数据。
  • 每当有ChannelHandler添加到ChannelPipeline中时都会创建ChannelHandlerContext。
  • 产生更短的事件流(调用的方法只会传递到下一个ChannelHandler),所以可以通过提升性能

 

九、引导

Netty体系结构_第6张图片

Netty体系结构_第7张图片

Bootstrap

 

Netty体系结构_第8张图片

ServerBootstrap 

Netty体系结构_第9张图片

从Channel引导客户端

Netty体系结构_第10张图片 ChannelOption

知识点

  1. 如果使用多个ChannelHandler,请使用ChannelInitializer,ChannelInitializer 可以向ChannelPipeline动态添加handeler;ChannelInitializer
  2. bossGroup, 用于处理客户端的连接请求; 另一个是 workerGroup, 用于处理与各个客户端连接的 IO 操作.
  3. 引导DatagramChannel,无连接协议不动用connent()只调用bind()
  4. 将ChannelOption用于引导,从而用于Channel
  5. AttributeMap
  6. AttributeKey:插入或获取属性值的泛型类
  7. 关闭:记得关闭EventLoopGroup,shutdownGracefully()该方法是异步的。

十、ByteBuf

1、堆缓冲区、直接缓冲区、复合缓冲区

2、索引

Netty体系结构_第11张图片

  1. get*操作不会移动readerIndex
  2. 任何read和skip开头的操作会检索或跳过位于当前readerIndex的数据,并增加已读字节
  3. readBytes(ByteBuf dest)该目标的缓冲区的writerIndex将被增加;
  4. clear()方法将 readerIndex 和 writerIndex 设为 0,但不会清除内存中的内容。
  5. clear()比 discardReadBytes()轻量,discardReadBytes可以丢弃已读字节回收空间。
  6. 查找:forEachByte(ByteBufProcessor.FIND_NUL);indexOf();
  7. 派生缓冲区(非独立副本):slice(int, int) Unpooled.unmodifiableBuffer(…) order(ByteOrder) readSlice(int) duplicate() slice();
  8. 独立副本使用:copy()
  9. ByteBufHolder:缓冲区池化,用于存储属性值;
  10. PooledByteBufAllocator:池化,减少内存碎片
  11. UnpooledByteBufAllocator:返回新的ByteBuf实例
  12. Unpooled:静态方法获得未池化的ByteBuf
  13. ByteBufUtil:静态方法hexdump()和equal方法等

关系整合

Netty体系结构_第12张图片

 

内置传输

Netty体系结构_第13张图片

NIO

Netty体系结构_第14张图片

OIO

Netty体系结构_第15张图片

支持的协议 

Netty体系结构_第16张图片

其它

出站:客户端到服务端

入站:服务端到客户端

ReferenceCountUtil.release(msg);释放消息

你可能感兴趣的:(netty)