Netty如何支持三种Reactor
参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code!
什么是Reactor及三种版本
反应堆设计模式(Reactor pattern):是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式。当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有的请求,然后派发这些请求至相关的工作线程进行处理。
三种版本:Reactor单线程(一个人包揽),Reactor多线程模式(多人分担),主从Reactor多线程模式(多人细工分担)。
Reactor是一种开发模式,模式的核心流程为:注册感兴趣的事件---->扫描是都有感兴趣的事件发生---->事件发生后做出相应的处理。
对于每一种的SocketChannel它监听的事件也不同,如下图!
如何在Netty中使用Reactor模式
上图中非主从Reactor多线程模式中"EventLoopGroup eventGroup = new NioEventLoopGroup()"中没有给参数,参考Reactor单线程模式给的参数是1,这里没有参数为什么是多线程模式?那是因为如果我们不去设置的话,它会根据CPU核数去计算出一个最优的线程数,现在单核CPU几乎没有了,所以现在几乎可以百分百的肯定这样就是多线程模式。
源码解释
public class MyServer {
public static void main(String[] args) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap sb = new ServerBootstrap();
sb.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(new MyServerHandler());
}
});
ChannelFuture f = sb.bind(8090).sync();
f.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
代码中标粗标大的就是主从Reactor模式的核心点,其中bossGroup(可以理解为主)和workerGroup(可以理解为从)都是需要被设置到ServerBootstrap中去,“sb.group(bossGroup,workerGroup)”则是绑定,进入group()方法:
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
super.group(parentGroup);
ObjectUtil.checkNotNull(childGroup, "childGroup");
if (this.childGroup != null) {
throw new IllegalStateException("childGroup set already");
}
this.childGroup = childGroup;
return this;
}
进入super.group(parentGroup);
可以看到"this.group = group”;group则是传入的“bossGroup”;this.group则是该类定义的成员。
volatile EventLoopGroup group;
而该成员在group()被return.
接下来需要查看哪里调用了该方法(windows下的idea按ctrl+alt+h可以查询),如图:
图上标记的“ChannelFuture regFuture = config().group().register(channel);”不难看出我们取到了group,再将channel绑定进去,这里的channel指的是:在服务器的开发那就是ServerSocketChannel。所以可以简单的理解:我们将ServerSocketChannel绑定到bossGroup上,有了ServerSocketChannel就能创建子的SocketChannel,再将子的SocketChannel绑定到之前的workerGroup上。
源码验证
还是之前的那张图,进入sb.group()中:
这里的“this.childGroup = childGroup;”的this.childGroup 也是定义的成员
private volatile EventLoopGroup childGroup;
查看this.childGroup谁在用,搜索发现:
final EventLoopGroup currentChildGroup = childGroup;
msg即SocketChannel,下面标红框的就是将msg进行绑定到workerGroup中,简单说就是两种SocketChannel绑定到两个Group里面去。这样就完成了主从Reactor模式的支持。
我只想做的更好,仅此而已
Netty如何支持三种Reactor的更多相关文章
- Netty中的三种Reactor(反应堆)
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- Netty Reator(三)Reactor 模型
Netty Reator(三)Reactor 模型 Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) 本文介绍 DC Sch ...
- Netty怎么切换三种I/O模式和源码解释
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 三种I/O模式 BIO:Block I/O,即同步并阻塞的IO:BI ...
- MySQL 5.6 以上版本支持三种sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。
Field 'id' doesn't have a default value问题解决方法 运维的名义关注0人评论3323人阅读2018-01-23 17:37:42 MySQL 5.0 以上版本 ...
- HTML5文件上传qq、百度、taobao等比较(改进支持三种状态提示)
拖拽过程详解: 1:文件未拖出文件选择框的时候提示:将要上传的文件或文件夹拖拽至此区域 2:文件拖出文件选择框但未拖入上传的文件框提示:请继续拖拽文件或文件夹至此区域 3:文件拖出文件选择框且已拖入上 ...
- Apache Spark支持三种分布式部署方式 standalone、spark on mesos和 spark on YARN区别
链接地址: http://dongxicheng.org/framework-on-yarn/apache-spark-comparing-three-deploying-ways/ Spark On ...
- cache支持三种pre-fetch方式:normal/pre-fetch1/pre-fetch2-way1/pre-fetch-way2
1.normal fetch ----fetch 1 cache line once 2. pre-fetch mode one ---- fetch 3 cache line once 3.pre ...
- DB2支持的三种表空间SMS、DMS、DMS的自动存储
DB2支持的三种表空间SMS.DMS.DMS的自动存储 DB2中,表空间是数据库与这个数据库中存储的表之间的逻辑层.表空间在数据库中创建,表在表空间中创建.容器是一个物理存储设备.它可以由目录名.设备 ...
- Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)
QT通过三种形式提供了对线程的支持.它们分别是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线 ...
随机推荐
- GC 老年代 新生代
参考资料: http://blog.csdn.net/flamezyg/article/details/44673951 http://www.blogjava.net/ldwblog/archive ...
- sublime中替换成换行
ctrl + h 打开替换窗口. replace with里输入 ctrl + shift + enter
- HDU 5974 A Simple Math Problem ——(数论,大连区域赛)
给大一的排位赛中数论的一题.好吧不会做...提供一个题解吧:http://blog.csdn.net/aozil_yang/article/details/53538854. 又学了一个新的公式..如 ...
- 关于Date
1.java DateUtil工具包可将"Wed, 21 Dec 2022 14:20:00 GMT"格式的字符串专程Date类型: Date expiration = DateU ...
- LeetCode 279. 完全平方数(Perfect Squares)
题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释 ...
- 性能分析 | JVM发生内存溢出的8种原因及解决办法
推荐阅读:史上最详细JVM与性能优化知识点综合整理 1.Java 堆空间 2.GC 开销超过限制 3.请求的数组大小超过虚拟机限制 4.Perm gen 空间 5.Metaspace 6.无法新建本机 ...
- CPU排行-台式
此文已经于2017年11月1日更新!来源于极速空间 实际对比: intel i3-7100(双核四线程) CPU性能远超过 AMD X4 860K(四核四线程) intel i5-7500(四核四线程 ...
- 'pybot.bat' 不是内部或外部命令,也不是可运行的程序
在通过命令行工具 运行RobotFramework的文件, 会使用到pybot.bat. 在dos输入pybot提示'pybot' 不是内部或外部命令,也不是可运行的程序或批处理文件, 可以在pyth ...
- echarts.js导致angular-translate加载模块失败
echarts.js导致angular-translate加载模块失败,待解决
- Vue.js父子组件如何传值 通俗易懂
父子组件传值原理图 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child.vue的中创建pr ...