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

39次阅读

共计 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
channelRegisteredJDK 注册胜利后回调所有 Handler 的办法 2
channelActivejdkChannel 被激活后回调 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 中的管道流的概念!

正文完
 0