文章目录

  • 一、 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 示例 :

① 222 线程池 : 服务器端有两个 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 线程池中线程个数为 111 ;

③ NioEventLoop 线程 : 该 BossGroup 线程池中的 EventLoop 线程实际类型是 NioEventLoop , 下面开始针对这 111 个 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 核数的 222 倍 , 假设服务器是 444 核的 , 那么默认该线程池中有 888 个线程 ;

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

③ 调用 next 方法分配策略 : 线程标号 000 ~ 888 , 第 000 个 NioSocketChannel 分配给第 000 个线程 , 然后第 888 个 NioSocketChannel 分配给第 888 个线程 , 第 999 个 NioSocketChannel 分配给第 000 个线程 ;

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

【Netty】Netty 核心组件 ( ChannelOption | EventLoopGroup )相关推荐

  1. Netty 的核心组件

    Netty 的核心组件有哪些? 1. Bootstrap 与 ServerBootstrap Bootstrap 与 ServerBootstrap 是 Netty 程序的引导类,主要用于配置各种参数 ...

  2. Netty的核心组件

    Netty是什么? Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.也就是说,Nett ...

  3. netty实战之ChannelOption配置

    服务端ServerBootstrap之ChannelOption配置 public static void main(String[] args) throws InterruptedExceptio ...

  4. Netty学习笔记(三)EventLoopGroup开篇

    使用Netty都需要定义EventLoopGroup,也就是线程池 前面讲过在客户端只需要一个EventLoopGroup就够了,而在服务端就需要两个Group--bossGroup和workerGr ...

  5. Netty学习1——Netty的核心组件

    Netty的核心组件 Netty的主要构件块:Channel.回调.Future.事件和ChannelHandler 1.Channel Channel是Java NIO的一个基本构造. 它代表一个到 ...

  6. Netty学习笔记(四)EventLoopGroup续篇

    @Overrideprotected void run() {for (;;) {try { switch (selectStrategy.calculateStrategy(selectNowSup ...

  7. Java netty的option(ChannelOption.SO_BACKLOG, backLog)什么意思

    这个都是socket的标准参数,并不是netty自己的. 具体为: ChannelOption.SO_BACKLOG, 1024 BACKLOG用于构造服务端套接字ServerSocket对象,标识当 ...

  8. 【Netty】option(ChannelOption.SO_KEEPALIVE, true) socket参数详解:KeepAlive

    .childOption(ChannelOption.SO_KEEPALIVE, true); childOption是用来给父级ServerChannel之下的Channels设置参数的 当设置为t ...

  9. Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接

    Netty心跳检测机制案例 案例要求 编写一个Netty心跳检测机制案例,当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,提示写空闲 服务器超过7秒没有读或者写操作时,就提示读写 ...

最新文章

  1. 阿里规范不建议多表join,可这SQL要怎么写啊?
  2. ARM指令集 VS Thumb指令集
  3. HTML/CSS快速入门
  4. 查看docker运行状态_docker商业版受限?请了解下crio
  5. 调用系统相机和相册,并且裁剪成圆形图片(解决6.0,7.0,8.0版本问题)
  6. Effective Java~37. 用EnumMap 代替序数索引
  7. Django文件上传***
  8. 王道机试指南读后总结-2
  9. 如何更改rhevm中admin的密码
  10. 猜51CTO的人群结构
  11. 拓端tecdat|R语言用综合信息准则比较随机波动率(SV)模型对股票价格时间序列建模
  12. Ubuntu 16.04 安装Matlab R2015b
  13. 使用prewitt算子分割白纸黑字图像(Matlab)
  14. Word插入带打勾图标的方框
  15. 考研小作文真题、范文及讲解
  16. 间断点怎么求?——6个例子来详细解析较难的间断点的求法
  17. 使用itext将HTML 生成PDF文件
  18. YUV RGB格式分析,以及对应码率(带宽)计算
  19. java实现王者荣耀匹配规则,王者荣耀匹配机制(通俗版)
  20. html5class命名规范,开发过程中应该遵守哪些编码规范和class命名规范?

热门文章

  1. Dynamips和Vmware完成CCVP试验(1)
  2. offsetLeft 、offsetWidth、scrollHeight等的区别
  3. 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
  4. Id.exe和ld.exe: cannot open output file … : Permission denied问题。
  5. 4.3、Libgdx启动类和配置
  6. 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
  7. 项目经理怎么在两周内熟悉一个项目的业务?
  8. Linux 系统 文件锁 fcntl函数详解
  9. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
  10. SQL-根据多个条件更新数据