问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Netty的基本架构详解

创作时间:
作者:
@小白创作中心

Netty的基本架构详解

引用
CSDN
1.
https://blog.csdn.net/qq827245563/article/details/145632545

EventLoopGroup基本认识

我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱:

我们上一节课使用的案例,使用的是 NioEventLoopGroup,他是NIO的实现,可以看出来他是 MultithreadEventLoopGroup 的子类,从名字上可以看出来,NioEventLoopGroup是一个多线程事件循环组,这里你可以把它看作是一个线程池,内部存在多个线程(NioEventLoop),每一个客户端连接的 SocketChannel 都对应一个线程(NioEventLoop)!

我们上面一直再说NioEventLoop, 我们基于上图可以看出来,他是 SingleThreadEventLoop 的子类,从名字上也能看出来,他是一个单线程的执行器!我们可以看到,他的父接口事实上也是继承与 EventLoopGroup,也就是说,虽然NIoEventLoop是一个单线程事件循环,但是我们基于接口,也可以把他看作为一个线程池,只不过这个线程池内部只有一个线程!

Netty的通讯通道

我们需要了解的Netty中的管道种类,这里我们重点分析NIO的实现方式:

我们可以看到,Netty的Socket通讯管道的主要实现方式有两种,NioServerSocketChannelNioSocketChannel,这两种实现是Netty对于服务端通道,与客户端通道的不同实现,我们在开发Netty的服务端与客户端的时候,会指定使用管道的类型! 这里面有一个比较重要的点,即NioServerSocketChannel的父类实现是 AbstractNioMessageChannel, NioSocketChannel的父类实现是AbstractNioByteChannel ,这两个实现是后续NIO事件循环的时候判断是处理连接还是处理数据的重要手段,这里留个印象,我们后续会详细说!

Netty的管道流

我们需要了解的Netty的业务执行链,又叫管道流 ChannelPipeline

我们的Netty代码中都会由类似这种逻辑的代码:

他是Netty能够让我们专注于业务的主要实现方式,他的主要实现是一个双向链表,这里是在链表末尾追加一个Handler业务处理器,Handler的种类大致分为两种:

如上图所示,他有两种实现方式,一个是 ChannelInboundHandlerAdapter 一个是 ChannelOutboundHandlerAdapter,他们的调用在一个业务流中的执行顺序如下,我们借用一个图示来说明:

当我们调用Socket的读数据的API时,即从Socket管道读取数据时,Pipeline会按照你的添加顺序依次执行 Inbound Handler,当我们读取事件完毕,调用write方法向通道内写入数据的时候,管道流开始调用 Outbound Handler方法,倒序调用!这个倒序调用可能不好理解,我们还是用图来说明:

当调用read方法的时候,顺序调用Inbound节点! 当调用write方法的时候,倒序调用outbount方法!

Netty的Handler事件回调种类

1. ChannelInboundHandler

方法名称
方法作用
handlerAdded
通道被添加
channelRegistered
JDK注册成功后回调所有Handler的方法
channelActive
jdkChannel被激活后回调
channelRead
通道内有数据可读
channelReadComplete
数据读取完毕
channelInactive
通道被关闭后回调该方法
channelUnregistered
通道被取消注册回调用该方法
handlerRemoved
通道被删除
userEventTriggered
如果触发了用户事件,则调用该方法。
channelWritabilityChanged
可写的状态改变
exceptionCaught
发生了异常

2. ChannelOutboundHandler

方法名称
方法作用
bind
进行绑定操作后调用。
connect
进行连接操作后调用。
disconnect
进行断开连接操作后调用。
close
进行关闭操作后调用。
deregister
从当前已注册的EventLoop进行注销操作后调用。
read
读数据
write
写数据
flush
刷新到管道

总结

通过本篇文章,我们可以了解到Netty中比较重要的几个概念,EventLoopGroup的基本概念、Netty中的通道概念、Netty中的管道流的概念!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号