Netty线程模型

  1. reactor单线程模型
  2. reactor多线程模型
  3. 主从reactor多线程模型
  4. Netty线程模型

1 reactor单线程模型

使用的是异步非阻塞I/O,所有的I/O都是不会导致阻塞的。通过Acceptor类接收客户端的TCP连接请求消息,当链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上,进行消息解码,用户线程消息编码后通过NIO线程将消息发送给客户端,适用于小容量模型的系统应用。

所有的I/O操作都在同一个NIO线程上面完成。
NIO线程的职责:

  • 作为NIO服务端,接收客户端的TCP连接
  • 作为NIO客户端,向服务端发起TCP连接
  • 读取通信对端的请求或者应答消息

2 reactor多线程模型

与单线程模型最大的区别是,有一组NIO线程来处理I/O操作,有一个专门NIO线程——Acceptor线程用于监听服务端,接收客户端的TCP连接请求,网络I/O操作有一个NIO线程池负责,在这类场景下,单独一个Acceptor线程可能会存在性能不足的问题。

3 主从reactor多线程模型

Acceptor线程池用于客户端登录、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的I/O线程上。主线程池用于接收请求,完成登录检验,子线程池负责后续I/O操作。

4 Netty线程模型

  1. 相关概念
  2. EventLoop的启动
  3. Bind绑定端口过程
  4. Channel概念
4.1 相关概念

可以同时支持以上三种模型,取决于用户的启动参数配置,调整线程池的线程个数等。

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try{
	ServerBootstrap b = new ServerBootstrap();
	b.group(bossGroup,workerGroup)
		.channel(NioServerSocketChannel.class)
		.channel(ChannelOption.SO_BACKLOG,100)
		.handler(new LoggingHandler(LogLevel.INFO)
		.childHandler(new ChannelInitializer<SocketChannel>(){

bossGroup职责

  • 接受客户端TCP连接,初始化Channel参数
  • 将链路状态变更时间通知给ChannelPipeline

worker职责

  • 异步读取数据报,发送读事件到ChannelPipeline
  • 异步发送消息到通信对端,调用ChannelPipeline的消息发送端口
  • 执行系统调用Task
  • 执行定时任务Task,例如链路空缺状态监测定时任务

NioEventLoopGroup是线程组,包含了一组NIO线程,专门用于处理网络事件,实际上是reactor线程组,bossGroup用于服务端接受客户端的连接,workGroup用于进行socketChannel的网络读写。

ServerBootstrap用于启动服务端的辅助启动类,目的是降低服务端的开发复杂度。

4.2 EventLoop的启动

EventLoop自身实现了Executor接口,当调用executor方法提交任务时,这判断是否启动,未启动则调用内置的executor创建新线程来触发run方法执行。

executor:请求执行任务
addTask:增加到任务队列
判断是否是EventLoop自身调用
startThread -> doStartThread
使用executor创建新线程执行run
4.3 Bind绑定端口过程
bind:AbstractBootstrap
创建和初始化Channel
注册到EventLoop中的Selector上
doBind0 -> channel.bind
pipeline.bind
HeadContext.bind
AbstractUnsafe.bind
NioServerSocketChannel.doBind
4.4 Channel概念

netty中的Channel是一个抽象的概念,可以理解为对JDK NIO Channel的增强和拓展。

AbstractChannel描述
-pipeline DefaultChannelPipeline通道内事件处理链路
-eventLoop EventLoop绑定的EventLoop,用于执行操作
-unsafe Unsafe提供I/O相关操作的封装
#config() ChannelConfig返回通道配置信息
+read() Channel开始读数据,触发读取链路调用
+write(Object msg) ChannelFuture写数据,触发链路调用
+bind(SocketAddress SocketAddress) ChannelFuture绑定

参考文章

网易云课堂《Java高级开发工程师》

结语

本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值