上一节课咱们对Netty有了一个初步的意识,这一节课咱们会一起鸟瞰整个Netty的脉络,以便于对Netty的架构原理有一个整体的认知!下图是Netty的次要架构骨架:(欢送关注wx公众号:【源码学徒】独特探索各类开源代码实现!)
EventLoopGroup根本意识
咱们须要理解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩大实现,下图是他的家族图谱:
咱们上一节课应用的案例,应用的是NioEventLoopGroup
,他是NIO的实现,能够看进去他是MultithreadEventLoopGroup
的子类,从名字上能够看进去,NioEventLoopGroup是一个多线程事件循环组,这里你能够把它看作是一个线程池,外部存在多个线程(NioEventLoop),每一个客户端连贯的SocketChannel
都对应一个线程(NioEventLoop)!
咱们下面始终再说NioEventLoop, 咱们基于上图能够看进去,他是SingleThreadEventLoop
的子类,从名字上也能看进去,他是一个单线程的执行器!咱们能够看到,他的父接口事实上也是继承与EventLoopGroup
, 也就是说,尽管NIoEventLoop是一个单线程事件循环,然而咱们基于接口,也能够把他看作为一个线程池,只不过这个线程池外部只有一个线程!
\## Netty的通信通道
咱们须要理解的Netty中的管道品种,这里咱们重点剖析NIO的实现形式:
咱们能够看到,Netty的Socket通信管道的次要实现形式有两种,NioServerSocketChannel
, NioSocketChannel
, 这两种实现是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 | 通道被增加 1 |
channelRegistered | JDK注册胜利后回调所有Handler的办法 2 |
channelActive | jdkChannel被激活后回调 3 |
channelRead | 通道内有数据可读 4 |
channelReadComplete | 数据读取结束 5 |
channelInactive | 通道被敞开后回调该办法 6 |
channelUnregistered | 通道被勾销注册回调用该办法 7 |
handlerRemoved | 通道被删除 8 |
userEventTriggered | 如果触发了用户事件,则调用该办法。 |
channelWritabilityChanged | 可写的状态扭转 |
exceptionCaught | 产生了异样 |
2. ChannelOutboundHandler
办法名称 | 办法作用 |
---|---|
bind | 进行绑定操作后调用。 |
connect | 进行连贯操作后调用。 |
disconnect | 进行断开连接操作后调用。 |
close | 进行敞开操作后调用。 |
deregister | 从以后已注册的EventLoop进行登记操作后调用。 |
read | 读数据 |
write | 写数据 |
flush | 刷新到管道 |
总结
通过本篇文章,咱们能够理解到Netty中比拟重要的几个概念,EventLoopGroup的基本概念、Netty中的通道概念、Netty中的管道流的概念!
发表回复