乐趣区

关于程序员:Netty的基本架构详解

上一节课咱们对 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 中的管道流的概念!

退出移动版