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工作模型

经验分享 程序员 微信小程序 职场和发展