netty模型

netty 多线程IO模型

netty介绍

netty IO模型是基于Java NIO 的一个封装,在Java NIO的基础上加上主从 Reactor 多线程模式的设计思想 诞生出来的高并发基于事件驱动的网络应用框架。

Netty 主要用于开发基于 TCP 协议的网络 IO 程序。Netty 是基于 Java NIO 构建出来的,Java NIO 又是基于 Linux 提供的高性能 IO 接口/系统调用构建出来的。

主从 Reactor 多线程模式

netty模型是基于主从 Reactor 多线程模式演变过来的,可以说是对主从 Reactor 多线程模式进行的再封装。其实有几种Reactor 线程模式 ,由于主从 Reactor 多线程模式最接近netty模型架构,并且也是几种Reactor 线程模式中最优化策略。所以这里介绍主从 Reactor 多线程模式。

模型图如下:(来源网络)

请添加图片描述

  1. Reactor 主线程 MainReactor 对象通过 select 监听客户端连接事件,收到事件后,通过 Acceptor 处理客户端连接事件。
  2. 当 Acceptor 处理完客户端连接事件之后(与客户端建立好 Socket 连接),MainReactor 将连接分配给 SubReactor。(即:MainReactor 只负责监听客户端连接请求,和客户端建立连接之后将连接交由 SubReactor 监听后面的 IO 事件。)
  3. SubReactor 将连接加入到自己的连接队列进行监听,并创建 Handler 对各种事件进行处理。
  4. 当连接上有新事件发生的时候,SubReactor 就会调用对应的 Handler 处理。
  5. Handler 通过 read 从连接上读取请求数据,将请求数据分发给 Worker 线程池进行业务处理。
  6. Worker 线程池会分配独立线程来完成真正的业务处理,并将处理结果返回给 Handler。Handler 通过 send 向客户端发送响应数据。
  7. 一个 MainReactor 可以对应多个 SubReactor,即一个 MainReactor 线程可以对应多个 SubReactor 线程。

netty多线程IO模型

netty多线程IO模型图:

请添加图片描述

  1. Netty 抽象出两组线程池:BossGroup 和 WorkerGroup,也可以叫做 BossNioEventLoopGroup 和 WorkerNioEventLoopGroup。每个线程池中都有 NioEventLoop 线程。BossGroup 中的线程专门负责和客户端建立连接,WorkerGroup 中的线程专门负责处理连接上的读写。BossGroup 和 WorkerGroup 的类型都是 NioEventLoopGroup。
  2. NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每个事件循环就是一个 NioEventLoop。
  3. NioEventLoop 表示一个不断循环的执行事件处理的线程,每个 NioEventLoop 都包含一个 Selector,用于监听注册在其上的 Socket 网络连接(Channel)。
  4. NioEventLoopGroup 可以含有多个线程,即可以含有多个 NioEventLoop。
  5. 每个 BossNioEventLoop 中循环执行以下三个步骤:++++
    • select:轮训注册在其上的 ServerSocketChannel 的 accept 事件(OP_ACCEPT 事件)
    • processSelectedKeys:处理 accept 事件,与客户端建立连接,生成一个 NioSocketChannel,并将其注册到某个 WorkerNioEventLoop 上的 Selector 上
    • runAllTasks:再去以此循环处理任务队列中的其他任务
  6. 每个 WorkerNioEventLoop 中循环执行以下三个步骤:+++++++
    • select:轮训注册在其上的 NioSocketChannel 的 read/write 事件(OP_READ/OP_WRITE 事件)
    • processSelectedKeys:在对应的 NioSocketChannel 上处理 read/write 事件
    • runAllTasks:再去以此循环处理任务队列中的其他任务
  7. 在以上两个processSelectedKeys步骤中,会使用 Pipeline(管道),Pipeline 中引用了 Channel,即通过 Pipeline 可以获取到对应的 Channel,Pipeline 中维护了很多的处理器(拦截处理器、过滤处理器、自定义处理器等)。这里暂时不详细展开讲解 Pipeline。
posted @   鸭梨的药丸哥  阅读(30)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示