对Netty组件的基本介绍

时间:2021-08-17 04:21:46

Netty的介绍

netty是一个异步的基于事件的框架,主要针对在tcp协议下,开发面向clients端的高并发应用。

netty本质是一个nio框架。

IO模型

Java共支持3中io模型 : BIO,AIO,NIO

BIO

同步阻塞,一个连接一个线程,有连接请求时服务端就需要启动一个线程处理。如果这个线程不做任何事就会造成不必要的开销。当并发数较大时,需要创建大量线程来处理连接。

NIO

同步非阻塞,可以做到一个线程处理多个操作。

NIO 有三大核心部分,Channel,Buffer ,selector

selector、 channel 和buffer的关系

  1. 每个channel 对应一个buffer
  2. selector 对应一个线程,一个线程对应多个channel
  3. 程序切换哪个channel 是由事件决定的。event
  4. selector 会根据不同的事件,在各个通道上切换
  5. Buffer 就是一个内存块,底层是有一个数组
  6. 数据的读取写入是通过buffer,既可以读也可以写, 两者切换的方法是flip
  7. channel 是双向的

Buffer缓冲区

一个可以读写数据的内存块,可以理解成一个容器对象。它负责从channel中读取数据,封装成Buffer对象。Buffer为每一个基本数据类型都提供了实现类。它主要有三个属性:

  • capacity

内存块的固定大小值

  • position

下一个要进行读写位置的索引

  • limit

在写模式下,limit = position ,在读模式下,它表示你最多读到之前写入的最大值

重要的方法

allocate(int count) 初始化buffer容量

get () 从 position 位置读

flip() 由写模式切换为读模式

Channel 通道

作用类似于流,但是可以同时进行读写,可以异步读写。

Channel在NIo中是一个接口,它的实现类有:

  • FileChannel 用于文件读写
  • ServerSocketChannel TCP数据读写
  • DatagramChannel 用于UDP数据读写

主要方法:

  • read 从通道读取数据并放到缓冲区中
  • write 把缓冲区的数据写到通道中
  • transferfrom
  • transferto

Selector 选择器

能够监测多个注册的通道上是否有事件发生,如果有事件发生获取事件交给通道处理。

主要方法:

  • open 获取一个选择器对象
  • SelectionKey register(seelctor,常量) 注册通道 ,常量一共有4种,read读,write写,connect 连接已建立 ,accept(有新的网络连接可以接入)
  • select() 监测所有注册的通道,阻塞

原生NIo存在的问题

类库与API复杂,开发难度大,有bug

Netty模型

  1. netty抽象出2组线程池,bossGroup 负责接受客户端的连接,workGroup 负责读写
  2. bossGroup 与workerGroup 都是NioEventLoopGroup
  3. 每一个NioEventLoopGroup相当于一个事件循环组,每个循环都是NIoEventLoop
  4. NIoEventLoop表示一个不断循环处理执行任务的线程

Netty核心模块组件

Bootstrap,ServerBootstrap

Channel

ChannelFuture

netty中所有操作都是异步的,所以我们需要一个能够确定其结果的方法。通过addListener() 方法获取通知。

ChannelHandler

处理入站和出栈逻辑的容器。

生命周期方法

handlerAdded 当ChannelHandler 添加到ChanelPipeLine中调用

handlerRemoved 移除时调用

它主要有2个子接口, ChannelInboundHandler 和 ChannelOutBoundHandler

ChannelPipeLine

它是ChannelHandler 的容器,内部定义了一组ChannelHandler,是一组过滤器链

ChannelHandlerContext

用于ChannelPipe 和 ChannelHandler的关联,同一个ChannelPipeline 里的ChannelHandler的交互。

ByteBuf

netty的数据容器,是netty实现数据传输的数据结构。

内部维护了两个不同的索引,readIndex ,writeIndex。通过这两个索引将数据划分为3个区域。已经读过的字节,可读字节,可写字节。相比于jdk原生的bytebuf ,它有两个指针,在读写转换时不需要进行flip()

到此这篇关于对Netty组件的基本介绍的文章就介绍到这了,更多相关Netty组件介绍内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_39464555/article/details/115198164