Netty(三)关于NioEventLoopGroup

学一学Netty中的NioEventLoopGroup

  • 一个Netty程序启动时,至少要指定一个EventLoopGroup
  • 假如我们使用NIO,那我们通常使用NioEventLoopGroup
  • 使用BIO,那我们可以初始化OioEventLoopGroup

官方DOC

在这里插入图片描述

  • 上图时Netty(4.1.6)中EventLoopGroup的解释
  • 在事件循环期间可对EventExecutorGroup进行Channel的注册,然后供后续使用
  • 到这里有一个模糊的概念,EventLoopGroup可以对Channel进行注册

方法实现

  • 通过其提供的接口方法可以发现EventLoopGroup定义了Channel的注册规范

在这里插入图片描述

EventLoopGroup结构图

父结构

在这里插入图片描述

  • 这里发现它的顶层父类是Executor对象。我们知道Netty是基于Java实现的RPC框架
  • 那么看到这里不难理解,EventLoopGroup其实是和线程相关的
  • Netty本质又是Reactor模型的实现,那么EventLoopGroup和Reactor肯定是有关系的

EventLoopGroup与Reactor

  • 还是熟悉的代码
EventLoopGroup workerGroup = new NioEventLookGroup();
Bootstrap boot = new Bootstrap();
boot.group(workerGroup);
  • 这里初始化了一个NioEventLookGroup对象,那么先来看一下EventLoopGroup的子结构
    在这里插入图片描述

  • 通过其子结构类图可以发现一些端倪

SingleThreadEventLoop       :   在一个线程中执行所有提交的任务
MultithreadEventLoopGroup   :   多线程并发处理提交的任务
EmbeddedEventLoop           :   用来测试 
ThreadPerChannelEventLoop   :   提供OIO的处理模式,每一个EventLoop对应一个线程对应一个Channel

通过NioEventLoopGroup窥视其冰山一角

  • NioEventLoopGroup官方DOC
    • 使用NIO模型,基于Channel选择了Selector选择器

在这里插入图片描述

  • 初始化
    • 未传入参数的话,使用默认线程数。并且在初始化过程中创建一个SelectorProvider对象,后续用来提供Selector
    • 默认线程数:处理器数 * 2

在这里插入图片描述

Bootstrap—group方法

  • 客户端实现
EventLoopGroup workerGroup = new NioEventLookGroup();
Bootstrap boot = new Bootstrap();
boot.group(workerGroup);
  • 服务端实现
EventLoopGroup group = new NioEventLookGroup();
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(group);
  • 服务端group方法实现
    • 这里我们可以发现,服务端的boss线程和worker线程实际上是同一个线程

在这里插入图片描述

  • 到这里我们可以发现,当我们设置单线程的时候。
  • NioEventLoopGroup线程池的数量只设置为1
  • Netty中的Acceptor和后续所有的接收到的请求都是在一个线程中处理的
  • 对应Reactor线程模型,就相当于Reactor的单线程模型

单线程模型

EventLoopGroup group = new NioEventLookGroup();
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(group);

多线程模型

//  设置   n > 1的线程数,当然要合理,不能无限大
EventLoopGroup group = new NioEventLookGroup(n);
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(group);

主从线程模型

EventLoopGroup boos = new NioEventLookGroup();
EventLoopGroup work = new NioEventLookGroup();
// 与客户端不同,服务端使用 ServerBootstrap
ServerBootstrap boot = new ServerBootstrap();
boot.group(boos, worker);
  • 看代码,通过对parentGroup和childGroup进行不同的处理,确定其不同的工作职责

在这里插入图片描述

NioEventLoopGroup如何工作的

  • 现在,对NioEventLoopGroup的作用以及原理有了一个基本的认识
  • 那么当任务过来的时候是如何被执行的呢

NioEventLoopGroup的实例化

  • 通过其实例化过程入手
  • 调用到 其父类 MultithreadEventLoopGroup 的构造方法,进行线程相关参数的设置

在这里插入图片描述

  • 调用到 MultithreadEventExecutorGroup 的 构造方法,重点看其中的 newChild 方法

    • 根据线程数量做循环
      在这里插入图片描述
  • 又回调到 NioEventLoopGroup 的 newChild 方法

在这里插入图片描述

  • 走到 NioEventLoop 的构造方法
    • 走到这里看到了熟悉的方法openSelector()选择器出现了

在这里插入图片描述

NioEventLoopGroup工作模型

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章