Java相关

网络相关 - Netty处理流程

2020-04-12  本文已影响0人  万福来

Netty中的关键概念

EventLoopGroup:一个 Netty 程序启动时, 至少要指定一个 EventLoopGroup对象,EventLoopGroup内有很多个EventLoop,负责处理事件;
EventLoop: 负责处理各种事件,相当于NIO的一个selector;
Channel:即通讯的通道,发送接受数据
ChannelPipeline:Channel的数据管道
ChannelHandler:可看作是处理ChannelPipeline中传输的数据的工具
ChannelHandlerContext:使得ChannelHandler可以和ChannelPipeline或其他handler进行交互等。
netty默认采用的是主从Reactor模型,一个是bossGroup,一个是workerGroup;
每个分组都可以分别指定里边的线程数量或者是EventLoop数量。
boosGroup主要负责处理连接事件,连接成功后,会将该连接重新注册到workerGroup,该分组不涉及具体业务逻辑,一般设置一个线程即可,而workerGroup主要用来处理连接成功后的数据读写事件,每个线程都会负责该连接下的所有读写事件,不会进行线程切换,所以该分组线程池设置多些。在Netty中,当有连接请求时,会从EventLoopGroup中拿到一个EventLoop,EventLoop会绑定一个Channel,随后做出具体的处理。每一个请求都有一个EventLoop去处理。EventLoop在这里扮演的角色就相当于一个线程用来监听selector事件,而EventLoopGroup就相当于线程池,负责管理调度EventLoop。

Netty的数据读写流程

那么在完成绑定Channel的操作后,具体怎么处理数据呢?Netty中,将Channel的数据管道抽象为ChannelPipeline,消息数据会在ChannelPipeline中流动和传递。ChannelPipeline是ChannelHandler的容器,持有I/O事件拦截器ChannelHandler的链表,负责对ChannelHandler的管理和调度。ChannelHandler可以看成处理ChannelPipeline中数据的工具,可以处理I/O事件或者拦截I/O操作, 并转发给它所在ChannelPipeline中的下一个handler。我们可以方便地新增和删除ChannelHandler来实现不同业务逻辑的处理。但是ChannelPipeline不是直接管理ChannelHandler的,而是通过ChannelHandlerContext来间接管理。Channel处理框图如下:


image.png

Netty中根据事件源头的不同将handler分为两种:InBound和OutBound。InBound事件通常由I/O线程触发,例如TCP连接建立和关闭、读事件等等,分别会触发相应的handler的方法。而OutBound事件则一般由用户主动发起的网络I/O操作,例如用户发起的连接操作,绑定操作和消息发送操作等,也会分别触发相应的方法。
可以从上图看到,Handler由headHandler到tailHandler组成了一条双向链表,Handler链使用了责任链的设计模式(类似在web开发中的filter和拦截器),当事件传入ChannelPipeline中后,会经过一个个handler的处理。当触发ChannelRead事件的时候,消息将从headHandler至tailHandler依次处理;当调用ChannelHandlerContext的write方法发送消息进行通讯时,消息先从tailHandler开始,经过一系列handler处理后传递至headHandler,最终被添加到消息发送缓冲区后刷新输出。

上一篇 下一篇

猜你喜欢

热点阅读