Netty模型
2022-04-14 22:18:59 88 举报
Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。它提供了一套丰富的API,支持多种传输协议,如TCP、UDP和HTTP等。Netty的核心组件包括Channel、EventLoop、ChannelHandler等,通过这些组件可以构建出复杂的网络通信模型。 Netty采用了Reactor模式,将I/O操作封装成EventLoop事件循环,实现了高性能的并发处理。同时,Netty还提供了多种编解码器,如ByteToMessageDecoder和MessageToByteEncoder,方便开发者实现自定义协议的解析和封装。
作者其他创作
大纲/内容
注册channel到Selector
Worker线程1
轮询监听的IO事件
应用程序
selector
监听
Reactor单线程
select
Worker1
Netty架构分析-简易
ChannelHandler
dispatch
worker Group
send
BossGroup
Thread
Client
WorkerGroup
ChannelPipeline
数据传输
读取数据
线程NioEventLoop
read
请求
数据处理(编码)
处理请求
Netty主要基于主从Reactors多线程,并且做了一定改进:1. BossGroup线程维护Selector,只关注Accept2. 当接收到Accept事件,获取到对应的SocketChannel,封装成NIOSocketChannel并注册到Worker线程(事件循环),并进行维护3.当worker线程监听到selector中通道发生自己感兴趣的事件后,就由handler进行处理,注意handler已经加入到通道。
Handler2
业务处理
Handler Pipeline系统处理逻辑
SubReactor
InboundEvent
TaskQueue
Worker线程池
NioEventLoop
说明:在使用Netty进行编程时,拦截操作和转换出入站数据,只需要您提供callback或者利用future即可,这使得链式编程操作简单,高效,并有利于编写可重复的,通用的代码。
NIOSocketChannel
处理任务队列
handler
ChannelHandlerContext
InboundHandler
Acceptor
Handler1
Worker线程2
处理IO事件
处理线程
ChannelPipeline提供了ChannelHandler链的容器。保存了ChannelHandler的List,用于处理或者拦截Channel的入站事件和出站操作。以客户端为例,如果事件运动方向是从客户端到服务端的,那么就是出站,如果客户端发送给服务端的数据会通过pipeline中一系列的ChannelOutboundHandler,并且被这些handler处理,反之则称为入站的。
head
线程组EventLoopGroup(CPU核 * 2)
ServerSocketChannel
响应缓冲队列
1. 一个Channel包含了一个ChannelPipeline,而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的双向链表,并且每个ChannelHandlerContext又关联着一个ChannelHandler2. 入站事件和出站事件在一个双向链表中,入站事件会从链表head往后传递到最后一个入站的handler,出站事件会从链表tail往前传递到最前一个出站的handler,两种类型的handler互不干扰。
Netty架构分析-详细
单Reactor线程
网络端口
handler在handler处理中可以使用callback或者future实现异步
Reactor
tail
注册
返回响应数据
accept
Channel
关注OP_ACCEPT
finishConnect完成连接的建立
显示数据
对客户端连接accept()
异步模型工作原理
Child线程组EventLoopGroup
Reactor主线程
NioServerSocketChannel
Selector多路复用轮询组件
SocketChannel客户端连接
异步模型Future-Listener机制1. 当future对象刚刚创建时,处于非完成状态,调用者可以通过返回的ChannelFuture来获取操作执行的状态,注册监听函数来执行完成后的操作。2. 常见有如下操作:* 通过isDone方法来判断当前操作是否完成* 通过isSuccess方法来判断已完成操作的当前操作是否成功* 通过getCause方法来获取已完成的当前操作失败的原因* 通过isCancelled方法来判断已完成的当前操作是否被取消* 通过addListener方法注册监听器,当操作已完成(isDone方法返回完成),将会通知指定监听器,如果Future对象已完成,则通知指定的监听器。3. 绑定端口是异步操作,当绑定操作处理完,将会调用相应的监听器处理逻辑。4. 相比传统阻塞I/O,执行I/O操作后,线程会被阻塞住,直到操作完成。异步处理的好处是不会造成线程阻塞,线程在I/O操作期间可以执行别的程序,在高并发情形下会更稳定和更高吞吐量。
Read / Write
MainReactor
注册上去
step 1:select
NioEventGroup
Worker Group
建立连接
Reactor多线程
connect建立网络连接
step 3:runAllTasks
发送请求
SocketChannel
请求数据ByteBuf
Boss Group
step 2:processSelectedKeys
OutboundEvent
处理响应
......
Pineline
Handler
OutboundHandler
Unsafe网络通信组件
NioSocketChannel
Parent线程组EventLoopGroup(CPU核*2)
Reactor子线程
监听请求
关注OP_CONNET
1. Netty抽象出两组线程池 Boss Group 专门负责接收客户端的连接,WorkerGroup 专门负责网络读写操作。2. BossGroup 和 WorkerGroup类型都是NioEventLoop3. NioEventGroup相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环是NioEventLoop4. NioEventLoop表示一个不断循环的执行处理任务的线程,每个NioEventLoop都有一个selector,用于监听绑定在其上点socket网络通讯。NioEventLoop内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由NioEventLoop负责。5. NioEventLoopGroup可以有多个线程,即可以含有多个NioEventLoop。6. 每个Boss NioEventLoop循环执行的步骤有3步1) 轮询accept事件2) 处理accept事件,与client建立连接,生成NioSocketChannel,并将其注册到某个Worker NIOEventLoop上的selector3) 处理任务队列的任务,即runAllTasks7. 每个Work NIOEventLoop循环执行的步骤1) 轮询read,write事件2) 处理i/o事件,即read,write事件,在对应NioSocketChannel处理3) 处理任务队列的任务,即runAllTasks8. 每个Worker NIOEventLoop 处理业务时,会使用pipeline(管道),pipeline中包含了channel,即通过pipeline可以获得对应通道,管道中维护了很多handler处理器。
RecvByteBufAllocator动态缓冲分配组件
读取响应数据
Accept
Netty模型
发送响应
主从Reactor多线程
请求缓冲队列
传统阻塞I/O服务模型
响应数据ByteBuf
0 条评论
下一页