Netty组件之Channel注册
前言
本文将分析EventLoopGroup初始化、EventLoop的选择策略以及Channel是如何通过EventLoop注册到Selector上的。
一、EventLoopGroup类图概览
在客户端示例代码中的中实例化了NioEventLoopGroup,接下来分析下该实例化过程。
EventLoopGroup workerGroup = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(workerGroup);
从以下类图结构io.netty.util.concurrent.AbstractEventExecutorGroup分支主要负责多线程任务的处理;io.netty.channel.EventLoopGroup分支主要负责Channel相关的注册。MultithreadEventExecutorGroup与MultithreadEventLoopGroup分别继承和实现了上面AbstractEventExecutorGroup和EventLoopGroup,将其负责的功能进行融合。
二、构造函数解读
构造函数
nThreads:eventLoopThreads线程数量,默认值0时取CPU核数的2倍,可以通过参数io.netty.eventLoopThreads指定
Executor:默认ThreadPerTaskExecutor
SelectorProvider默认SelectorProvider.provider(),用于开启Selector和Channel
SelectStrategyFactory:SelectStrategy工厂类,默认DefaultSelectStrategyFactory
EventExecutorChooserFactory:EventExecutor选择器,默认为DefaultEventExecutorChooserFactory
三、初始化EventExecutor数组
代码解读
EventExecutor[] children:数组大小为nThreads,默认为CPU核数乘以2。
EventExecutor继承了EventExecutorGroup本质上为线程框架类Executor
children[i]:数据元素为EventLoop,本示例中为NioEventLoop。
NioEventLoop类图
NioEventLoop继承了SingleThreadEventLoop,SingleThreadEventLoop同时继承和实现了EventExecutor和EventLoop。即:NioEventLoop拥有了线程类框架处理多线程任务的能力和处理Channel能力。
备注:本文中EventExecutor数组children的元素为NioEventLoop,NioEventLoop同时拥有线程框架能力和Channel注册等处理能力。
四、EventExecutor选择器
第三部分对EventExecutor[] children进行初始化分析,然在使用时如何选择其中一个元素呢?
在初始化过程中有以下一行代码,用于初始化EventExecutorChooser。
chooser = chooserFactory.newChooser(children);
@2 如果数组长度不是2的幂次方,选择GenericEventExecutorChooser,executors[Math.abs(idx.getAndIncrement() % executors.length)]。
五、Channel注册
Channel注册入口
选择EventLoop
本文为NioEventLoop
绑定Channel到EventExecutor
通过DefaultChannelPromise绑定Channel到EventExecutor(NioEventLoop)
将Channel注册到Selector
作者丨梁勇
来源丨瓜农老梁(ID:gh_01130ae30a83)
欢迎关注公众号“瓜农老梁”
本文分享自微信公众号 - 瓜农老梁(gh_01130ae30a83)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深入理解Object提供的阻塞和唤醒API
点击上方蓝字 ↑↑ Throwable文摘 关注公众号设置星标,不定时推送高质量原创文章 关注 前提 前段时间花了大量时间去研读JUC中同步器AbstractQueuedSynchronizer的源码实现,再结合很久之前看过的一篇关于Object提供的等待和唤醒机制的JVM实现,发现两者有不少的关联,于是决定重新研读一下Object中提供的阻塞和唤醒方法。本文阅读JDK类库源码使用的JDK版本是JDK11,因此本文内容可能不适合于其他版本。 Object提供的阻塞和唤醒API java.lang.Object作为所有非基本类型的基类,也就是说所有java.lang.Object的子类都具备阻塞和唤醒的功能。下面详细分析Object提供的阻塞和唤醒API,它们有一共共同特点:必须在synchronized所修饰的代码块或者方法中使用。 阻塞等待-wait 等待-wait()方法提供了阻塞的功能,分超时和永久阻塞的版本,实际上,底层只提供了一个JNI方法: //这个是底层提供的JNI方法,带超时的阻塞等待,响应中断,其他两个只是变体publicfinalnativevoidwait(lon...
- 下一篇
现有CDP-DC集群启用Auto-TLS
文档编写目的 本文主要介绍如何在现有的 CDP-DC 集群上启用 TLS 。 内容概述 1) TLS概述 2) Level-0:基础TLS/SSL配置(在CM server主机上进行) 3) Level-1:为集群启用加密 测试环境 1) CM和Cloudera Runtime版本为7.1.1 2) Redhat7.7 3) 拥有Cloudera Manager的管理员账号 4) 集群未启用Kerberos和LDAP认证 TLS概述 背景 部署了Kerberos之后,CM会提示有安全隐患,至少需要一级TLS加密。 介绍 传输层安全性( TLS )在 ClouderaManager 服务器和代理之间的通信中提供加密和身份验证。 加密可防止通信侦听,并且身份验证有助于防止恶意服务器或代理在群集中引起问题。 Cloudera Manager 支持三种级别的 TLS 安全性,三种必须逐级配置。 级别1(好) - 此级别仅配置浏览器和ClouderaManager之间以及代理和ClouderaManager服务器之间的加密通信。请参阅仅为Cloudera Manager配置TLS加密,然后按照级...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果