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

非阻塞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

知识点

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

十、ByteBuf

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

2、索引

  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方法等

关系整合

 

内置传输

NIO

OIO

支持的协议 

其它

出站:客户端到服务端

入站:服务端到客户端

ReferenceCountUtil.release(msg);释放消息

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值