【Netty】Netty 核心组件 ( ChannelOption | EventLoopGroup )

简介: 【Netty】Netty 核心组件 ( ChannelOption | EventLoopGroup )

文章目录

一、 ChannelOption 组件

二、 EventLoopGroup 线程池组件

三、 BossGroup 与 WorkerGroup 运行机制





一、 ChannelOption 组件


ChannelOption 组件用于对 Channel 通道进行配置 ;




1 . ChannelOption.SO_KEEPALIVE 参数 : 设置该客户端连接一直处于活跃状态 ;




2 . ChannelOption.SO_BACKLOG 参数 :



① 设置连接数 : 设置服务器可连接队列个数 ;


② 连接请求队列机制 : 当客户端的请求到达服务器端 , 如果服务器端正在处理其它客户端的连接的事件时 , 先将本次的客户端连接请求放入队列中等待 , ChannelOption.SO_BACKLOG 参数就是设置该队列的大小 ;




3 . 关于服务器端连接数说明 :



① 顺序处理 : 服务器端处理客户端连接的请求事件 , 按照连接队列中的顺序 , 依次处理 ;


② 处理性能 : 服务器端每个线程每次只能处理单个客户端连接的请求事件 ;


③ 处理极限 : 因此如果连接请求数过多 , 超出服务器处理能力 , 就会造成整体性能下降 ;


④ 设置限制 : 使用该 ChannelOption.SO_BACKLOG 参数控制服务器的连接请求数 , 是很有必要的 ;




4 . ChannelOption 配置 Channel 通道示例 :



① option : 用于设置 BossGroup 线程池的参数 , BossGroup 负责与客户端建立连接 , 因此这里的 ChannelOption.SO_BACKLOG 参数用于设置连接操作的请求 , 不涉及到与客户端进行数据读写 ;


② childOption : 用于设置 WorkerGroup 线程池参数 , WorkerGroup 负责与客户端进行数据交互 ;


ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup) // 设置 主从 线程组 , 分别对应 主 Reactor 和 从 Reactor
        .channel(NioServerSocketChannel.class)  // 设置 NIO 网络套接字通道类型
        // 核心代码 ---------------------------------------------------------------------
        .option(ChannelOption.SO_BACKLOG, 128)  // 设置线程队列维护的连接请求个数
        .childOption(ChannelOption.SO_KEEPALIVE, true)  // 设置连接状态行为, 保持连接状态
        // 核心代码 ---------------------------------------------------------------------
        .childHandler( null );






二、 EventLoopGroup 线程池组件


1 . EventLoopGroup 接口与实现类 :



① 接口 : EventLoopGroup 是接口 , 继承了 EventExecutorGroup 接口 ;


public interface EventLoopGroup extends EventExecutorGroup


② 实现类 : 接口不能直接使用 , 实际使用的类是 NioEventLoopGroup ;


public class NioEventLoopGroup extends MultithreadEventLoopGroup




2 . EventLoopGroup 线程池机制 :



① 线程池 : EventLoopGroup 线程池中有多个 EventLoop 线程同时运行 ;


② 线程 : 每个 EventLoop 线程中都有一个 选择器 Selector 和 TaskQueue 任务队列 , 控制该线程接受并执行任务 ;


③ 线程调度 : 当有任务分配给 EventLoopGroup 线程池时 , 调用 next 方法 , 从 EventLoopGroup 线程池中获取 EventLoop 线程处理该任务 ;




3 . 服务器端的 EventLoopGroup 示例 :



① 2 22 线程池 : 服务器端有两个 EventLoopGroup 线程池 , 分别是 BossGroup 和 WorkerGroup ;


② BossGroup 线程池 : 处理客户端的连接事件 , 建立与客户端的连接 ;


③ WorkerGroup 线程池 : 处理客户端的数据交互事件 , 实现客户端与服务器端的数据读写 ;


// 1. 创建 BossGroup 线程池 和 WorkerGroup 线程池, 其中维护 NioEventLoop 线程
//     NioEventLoop 线程中执行无限循环操作
// BossGroup 线程池 : 负责客户端的连接
// 指定线程个数 : 客户端个数很少, 不用很多线程维护, 这里指定线程池中线程个数为 1
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
// WorkerGroup 线程池 : 负责客户端连接的数据读写
EventLoopGroup workerGroup = new NioEventLoopGroup();




4 . EventLoopGroup 常用方法 :



① 构造方法 : 可以使用无参的构造方法 , 也可以在构造方法参数中指定线程池线程个数 ;


EventLoopGroup bossGroup = new NioEventLoopGroup(1);  // 有参构造方法, 执行线程个数
EventLoopGroup workerGroup = new NioEventLoopGroup(); // 无参构造方法 , 默认线程个数, CPU 核数 * 2 


② 断开连接方法 : 调用 shutdownGracefully 方法 , 优雅地断开连接 ;


bossGroup.shutdownGracefully();






三、 BossGroup 与 WorkerGroup 运行机制




1 . BossGroup 线程池简述 :



① BossGroup 线程池类型 : BossGroup 的真实类型是 NioEventLoopGroup 类型的 ;


② BossGroup 线程池中线程个数 : BossGroup 线程池一般都只放一个线程 , 如上面代码中 new NioEventLoopGroup(1) 指定 BossGroup 线程池中线程个数为 1 11 ;


③ NioEventLoop 线程 : 该 BossGroup 线程池中的 EventLoop 线程实际类型是 NioEventLoop , 下面开始针对这 1 11 个 EventLoop 线程进行解析 ;




2 . BossGroup 线程池 建立与客户端连接 细节 :



① 注册通道 : NioEventLoop 线程中注册了 NioServerSocketChannel , 这是服务器端负责建议与客户端连接的 服务器套接字通道 ;


② NioEventLoop 线程轮询监听 : NioEventLoop 线程的 选择器 Selector 监听客户端的 连接事件 , 监听到之后 , 就会建立与客户端的连接 ;


③ 建立连接 : 服务器端建立与客户端的连接 , 最终得到一个 NioSocketChannel 连接通道 , 通过该通道可以与客户端进行数据读写交互 ;



此时 BossGroup 线程池任务告一段落 , 将该 NioSocketChannel 套接字通道交给 WorkerGroup 线程池进行处理 ;




3 . WorkerGroup 线程池 接收客户端连接 细节 :



① 传递 NioSocketChannel : BossGroup 线程池中连接建立完成 , 将 NioSocketChannel 传递给了 WorkerGroup 线程池 ;


② WorkGroup 线程池概述 : WorkerGroup 线程池中有多个 NioEventLoop 线程 , 每个 NioEventLoop 线程都要维护多个 NioSocketChannel 客户端套接字通道 ;


③ 选择线程池 : WorkerGroup 线程池调用 NioEventLoopGroup 的 next 方法 , 选择一个 NioEventLoop 线程 , 接收这个客户端套接字通道 NioSocketChannel ;


④ 注册通道 : 将该 NioSocketChannel 注册给 NioEventLoop 线程中的 选择器 Selector , 即可监听该客户端连接的数据读写事件 ;




4 . NioEventLoopGroup 线程池选择线程 next 方法规则 :



① WorkerGroup 线程池中线程个数 : 默认的线程个数是 CPU 核数的 2 22 倍 , 假设服务器是 4 44 核的 , 那么默认该线程池中有 8 88 个线程 ;


② 传递 NioSocketChannel : 当 BossGroup 建立连接成功 , 传递 NioSocketChannel 给 WorkerGroup 线程池 , WorkerGroup 需要选择一个 NioEventLoop 线程接收该 NioSocketChannel 客户端套接字通道 ;


③ 调用 next 方法分配策略 : 线程标号 0 00 ~ 8 88 , 第 0 00 个 NioSocketChannel 分配给第 0 00 个线程 , 然后第 8 88 个 NioSocketChannel 分配给第 8 88 个线程 , 第 9 99 个 NioSocketChannel 分配给第 0 00 个线程 ;



总结 : 第 n nn 个线程分配给 n % 9 n \% 9n%9 个线程 ;


目录
相关文章
|
3月前
|
前端开发 网络协议 Java
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
Netty | 工作流程图分析 & 核心组件说明 & 代码案例实践
109 0
|
3月前
|
网络协议 前端开发 Java
Netty Review - 核心组件扫盲
Netty Review - 核心组件扫盲
71 0
|
7月前
|
监控 前端开发 网络协议
Netty核心组件详解
Netty核心组件详解
33 0
|
7月前
|
编解码 前端开发 Java
源码分析Netty:核心组件及启动过程分析
本篇从实例出发,了解Netty核心组件的概念、作用及串联过程。从概念到设计原理,再到深入了解实现细节,从而能够清晰地掌握Netty的技术细节甚至存在的问题,才能最终更好地支持我们实际的各项业务。
314 0
|
8月前
|
前端开发 Java 调度
Netty中有哪些核心组件?
最近又有粉丝问我这样一个问题,说Netty中最核心的组件有哪些?它们都起什么作用?今天,给大家详细聊一聊
53 0
|
存储 缓存 编解码
Netty源码剖析之核心组件
NioEventLoop有以下核心功能。 - 开启Selector并初始化。 - 把ServerSocketChannel注册到Selector上。 - 处理各种I/O事件,如OP_ACCEPT、OP_CONNECT、OP_READ、 OP_WRITE事件。 - 执行定时调度任务。 - 解决JDK空轮询bug。
|
存储 前端开发 Java
【Netty】Netty核心组件介绍
前篇博文体验了Netty的第一个示例,下面接着学习Netty的组件和其设计。
252 0
【Netty】Netty核心组件介绍
【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )(一)
【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )(一)
108 0
【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )(一)
【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )(二)
【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )(二)
143 0
【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )(二)
【Netty】Netty 核心组件 ( Pipeline | ChannelPipeline )
【Netty】Netty 核心组件 ( Pipeline | ChannelPipeline )
149 0
【Netty】Netty 核心组件 ( Pipeline | ChannelPipeline )