首页 > 其他分享 >Netty

Netty

时间:2023-03-02 21:22:54浏览次数:45  
标签:NioEventLoop Netty EventLoop 线程 EventLoopGroup Channel 通道

数据模型

最主要的就是 Channel

  • 每一个 Channel 都有自己的 ChannelPipeline
  • 每一个 Channel 只会和一个 EventLoop 绑定

EventLoop 和 Channel 是一对多关系.

EventLoopGroup 和 EventLoop 是一对多关系.

Channel

就是用来读写数据的,每个 Channel 都有自己的 ChannelPipeline;可以把一个 Channel 当作 TCP 的客户端或服务端。

Channel 有哪些:

  • DatagramChannel: UDP
  • ServerSocketChannel: TCP 服务端
  • SocketChannel: TCP 客户端

NIO、EPoll、KQueue 支持零拷贝;例如 NIOServerSocketChannel。

ChannelPipeline

就是 ChannelHandler 的链表;每一个 ChannelHandler 可以处理:

  • 入站事件: ChannelInboundHandler
  • 出站事件: ChannelOutboundHandler
  • 或则两个都可以

ChannelHandler 就是具体的业务逻辑。

EventLoopGroup

就是一个 EventLoop 的线程池,主要就是:

  • 创建 EventLoop
  • 向其中一个 EventLoop 中注册 Channel

ScheduledExecutorService

EventLoopGroup创建并管理一个NioEventLoop线程池,它负责执行特定通道的I/O操作。每个NioEventLoop线程都与一个Selector相关联,Selector被用来管理多个通道并在这些通道上执行I/O操作。

NioEventLoopGroup类创建并管理一组NioEventLoop线程,它们负责执行特定通道的I/O操作。每个NioEventLoop线程都与一个Selector相关联,该Selector用于管理多个通道并在这些通道上执行I/O操作。

在Netty中,EventLoop是一个单线程实体,为一个特定的通道执行I/O操作。一个EventLoopGroup是一个EventLoop的集合,可以用来处理多个通道的I/O操作。

MultithreadEventLoopGroup扩展了EventLoopGroup接口,提供了一种实现EventLoopGroup的方法,它使用多个线程来处理其通道的I/O操作。这是通过创建一个EventLoop实例池来实现的,每个实例都在自己的线程中运行,然后将传入的I/O操作分配给它们。

NioEventLoopGroup是MultithreadEventLoopGroup的具体实现,用于Netty中基于NIO选择器的通道。它为处理I/O操作提供了一个事件驱动的编程模型,例如通过网络读写数据。

NioEventLoopGroup创建并管理一个NioEventLoop线程池,它负责执行特定通道的I/O操作。每个NioEventLoop线程都与一个Selector相关联,Selector被用来管理多个通道并在这些通道上执行I/O操作。

当一个通道被注册到NioEventLoopGroup时,它被添加到与一个NioEventLoop线程相关的Selector中。然后,NioEventLoop线程在选择器上等待I/O事件,并在事件发生时执行适当的I/O操作。

NioEventLoopGroup提供了几个构造器来创建具有不同配置的实例,如池中的线程数量和用于创建线程的执行器。

总的来说,NioEventLoopGroup是Netty架构中的一个关键组件,为网络应用中基于NIO的I/O操作提供了一个可扩展和高性能的解决方案。

一个能同时处理多个线程的任务的EventLoopGroup实现的抽象基类叫做 "MultithreadEventLoopGroup"。

该类提供了一种创建和管理多个EventLoop实例的方法,这些实例被用来执行I/O操作,并以非阻塞方式处理事件。每个EventLoop都在一个单独的线程中运行,任务可以在它们之间分配,以便并发执行。

MultithreadEventLoopGroup还提供了关闭EventLoop和释放其相关资源的方法。

这个类经常被用于高性能的网络应用中,其中需要多个线程来处理大量的并发连接和I/O操作。通过使用多线程的EventLoopGroup,应用程序可以充分利用可用的CPU资源,提高其整体性能。

这是 EventLoop 对象的容器。每个 EventLoop 对象只与一个线程相关联。每个 Channel 在其整个生命周期中都与一个 EventLoop 相关联。

虽然每个 Channel 都与单个 EventLoop 相关联,但 EventLoop 最终可能会与多个 Channels 相关联。这一点很重要,我们稍后会深入探讨其含义。

EventLoopGroup 有多种实现,使用的特定实现必须与传输相匹配:例如,NIOEventLoopGroup 必须与 NIO 传输一起使用,OIOEventLoopGroup 与 OIO 传输等。在单个组中创建的 EventLoop 对象的数量取决于关于 EventLoopGroup 的实现:OIOEventLoopGroup 为每个新 Channel 创建一个新的 EventLoop,而 NIO/EPoll/Kqueue 组创建一个 2 * 数量的处理器池,并将它们均匀分布在 Channel 中。

Channel 的所有事件和处理程序都在其单个 EventLoop 上执行。这些 EventLoop 对象可以被认为是 I/O 线程,因为它们处理 Netty 应用程序或驱动程序中的所有 I/O,包括 ChannelPipeline 中的 ChannelHandlers 中发生的任何处理。

EventLoop 中有一个任务队列,最小是 16 最大是 int 类型最大值

参考资料

https://medium.com/@akhaku/netty-data-model-threading-and-gotchas-cab820e4815a

https://livebook.manning.com/book/netty-in-action/chapter-7/13

标签:NioEventLoop,Netty,EventLoop,线程,EventLoopGroup,Channel,通道
From: https://www.cnblogs.com/jnyyxz/p/17171523.html

相关文章

  • 《netty实战》10-11章
    第10章编解码器框架                                    第11章预置的ChannelHandler......
  • 《netty实战》笔记 1-8章
    第1章            此方式(javaAPI阻塞方式):一个客户端——一个线程当客户端连接非常多时很不理想 JavaNIO——非阻塞      ......
  • Gateway集成Netty服务
    Gateway和Netty都有盲区的感觉;一、Netty简介Netty是一个异步的,事件驱动的网络应用框架,用以快速开发高可靠、高性能的网络应用程序。传输服务:提供网络传输能力的管理;......
  • 即时通讯技术文集(第9期):Java NIO和Netty入门系列 [共19篇]
    为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第9 期。[-1-] 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别[链接] htt......
  • Gateway集成Netty服务
    目录一、Netty简介二、Netty入门案例1、服务端启动2、通道初始化3、自定义处理器4、测试请求三、Gateway集成1、依赖层级2、自动化配置四、配置加载1、基础配置2、属性配置......
  • java netty socket实例:报文长度+报文内容,springboot
    前言说实话,javanetty方面的资料不算多,尤其是自定义报文格式的,少之又少自己写了个简单的收发:报文长度+报文内容发送的话,没有写自动组装格式,自己看需求吧,需要的话,自己完......
  • 一文详解 Netty 组件
    作者:京东物流张弓言一、背景Netty是一款优秀的高性能网络框架,内部通过NIO的方式来处理网络请求,在高负载下也能可靠和高效地处理I/O操作作为较底层的网络通信框架,......
  • 一文详解 Netty 组件
    作者:京东物流张弓言一、背景Netty是一款优秀的高性能网络框架,内部通过NIO的方式来处理网络请求,在高负载下也能可靠和高效地处理I/O操作作为较底层的网络通信框架,其被......
  • 手把手教你为基于Netty的IM生成自签名SSL/TLS证书
    1、引言对于IM聊天应用来说,为了提升安全性,对聊天消息加密是常规操作。众所周之,Netty是高性能的JavaNIO网络通信框架,因而用Netty来写IM是再正常不过了。网上关于为Netty......
  • Springboot 系列 (22) - Springboot+Netty | 使用 Netty 封装的 WebSocket 实现消息实
    Netty是由JBOSS提供的一个Java开源框架。Netty是一个基于JavaNIO的开发框架,主要针对在TCP协议下,面向Client端的高并发应用,或者Peer-to-Peer场景下的大量数......