共计 2003 个字符,预计需要花费 6 分钟才能阅读完成。
上一节课咱们对 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 中的管道流的概念!