关于程序员: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中的管道流的概念!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理