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

技术
今日推荐
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信