对Netty组件的基本介绍

 更新时间:2021年06月30日 11:46:10   作者:二次函数太  
这篇文章主要介绍了对Netty组件的基本介绍,Netty是基于Java NIO client-server的网络应用框架,使用Netty可以快速开发网络应用,本文涵盖了netty开发中主要的组件的介绍,需要的朋友可以参考下

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组件介绍内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java开发学习之Bean的生命周期详解

    Java开发学习之Bean的生命周期详解

    从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲Bean的生命周期,感兴趣的可以学习一下
    2022-06-06
  • Java中的异常Exception与处理方式详解

    Java中的异常Exception与处理方式详解

    这篇文章主要介绍了Java中的异常Exception与处理方式详解, Java语言中,将程序执行中发生的不正常情况称为"异常"(开发过程中的语法错误和逻辑错误不是异常),需要的朋友可以参考下
    2024-01-01
  • Java由浅入深学习数组的使用

    Java由浅入深学习数组的使用

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素
    2022-05-05
  • spring boot实现在request里解密参数返回

    spring boot实现在request里解密参数返回

    这篇文章主要介绍了Spring Boot实现在request里解密参数返回操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java模拟新浪微博登陆抓取数据

    Java模拟新浪微博登陆抓取数据

    本文主要介绍了Java模拟新浪微博登陆抓取数据的实现方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Gson中@JsonAdater注解的几种方式总结

    Gson中@JsonAdater注解的几种方式总结

    这篇文章主要介绍了Gson中@JsonAdater注解的几种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • java DelayQueue的原理浅析

    java DelayQueue的原理浅析

    在本篇文章里小编给大家整理的是一篇关于java DelayQueue的原理浅析,有兴趣的朋友们可以参考学习下。
    2021-01-01
  • SpringSceurity实现短信验证码登陆

    SpringSceurity实现短信验证码登陆

    这篇文章主要介绍了SpringSceurity实现短信验证码登陆,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • java客户端Etcd官方仓库jetcd中KeepAlive接口实现

    java客户端Etcd官方仓库jetcd中KeepAlive接口实现

    这篇文章主要为大家介绍了java客户端Etcd官方仓库jetcd中KeepAlive接口实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,多多加薪
    2022-02-02
  • Springboot内置的工具类之CollectionUtils示例讲解

    Springboot内置的工具类之CollectionUtils示例讲解

    这篇文章主要介绍了Springboot内置的工具类之CollectionUtils,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12

最新评论