当前位置: 首页 > 科技观察

Netty基本架构详解

时间:2023-03-15 18:53:37 科技观察

本文转载自微信公众号《源码学徒》,作者皇甫傲傲鸣。转载本文请联系出处学徒公众号。有道无术,尚可求之!有技巧没办法,止于技巧!上节课,我们对Netty有了初步的了解。本节课,我们将一起纵览Netty的整个脉络,以方便大家对Netty的理解。Netty的架构原理有了一个整体的认知!下图是Netty的主要架构骨架:Netty的主要架构图EventLoopGroup基本了解了我们需要了解的EventLoopGroup,Netty对EventLoopGroup做了很多的扩展实现。下图是他家的Map:image-20210421090036067上节课我们用到的案例用到了NioEventLoopGroup,就是NIO的实现。可以看出它是MultithreadEventLoopGroup的子类。从名字可以看出,NioEventLoopGroup是一个多线程的Thread事件循环组,这里可以把它看成一个线程池,里面有多个线程(NioEventLoop),客户端连接的每个SocketChannel对应一个线程(NioEventLoop)!上面我们一直在说NioEventLoop,我们基于上面的图片可以看出,它是SingleThreadEventLoop的一个子类。从名字上也能看出是单线程执行器!我们可以看到它的父接口其实是继承自EventLoopGroup的,也就是说NIOEventLoop虽然是一个单线程的事件循环,但是基于这个接口,我们也可以把它看成一个线程池,只不过这个里面只有一个线程线程池!##Netty通信通道我们需要了解Netty中管道的种类,这里我们重点介绍NIO的实现:image-20210421091642282我们可以看到Netty的Socket通信通道主要有两个实现,NioServerSocketChannel,NioSocketChannel,这两个实现就是Netty的serverchannel和clientchannel实现的区别,我们在开发Netty的server和client的时候,都会指定使用的pipeline类型!这里还有一个比较重要的一点,就是NioServerSocketChannel的父类实现是AbstractNioMessageChannel,而NioSocketChannel的父类实现是AbstractNioByteChannel。实现是后续的NIO事件循环在判断是处理连接还是处理数据的重要手段时,在这里留下印象,后面再详细说!Netty的流水线我们需要了解一下Netty的业务执行链,也叫流水线ChannelPipeline:我们的Netty代码会由类似这样逻辑的代码组成:它是Netty让我们专注于业务的主要实现方式。它的主要实现是一个双向链表。这里在链表的末尾添加了一个Handler业务处理器。大致有两种类型的处理程序。:如上图所示,它有两种实现方式,一种是ChannelInboundHandlerAdapter,一种是ChannelOutboundHandlerAdapter。它们在一个业务流程中的调用执行顺序如下。我们用一张图来说明一下:当我们调用Socket的API读取数据时,也就是从Socket管道中读取数据时,Pipeline会按照你添加的顺序依次执行InboundHandler。当我们完成读取事件并调用write方法将数据写入通道时,管道流开始调用OutboundHandler方法。逆序调用!这种倒序调用可能不太好理解。我们用图来说明:调用read方法时,依次调用inbound节点!调用write方法时,倒序调用outbount方法!Netty的Handler事件回调类型1.ChannelInboundHandler方法名方法函数handlerAdded添加通道1channelRegisteredJDK注册成功后所有Handler的回调方法2channelActivejdkChannel激活后的回调3channelRead数据可读入通道4channelReadComplete数据读取完成5channelInactive该方法在通道关闭后回调。6channelUnregistered通道未注册。这个方法被回调。7handlerRemoved通道被删除。8userEventTriggered如果用户事件被触发,则调用该方法channelWritabilityChanged可写状态改变exceptionCaught发生异常2.ChannelOutboundHandler方法名该方法在bind执行绑定操作后调用。connect在执行连接操作后调用。disconnect在执行断开连接操作后调用。close在执行关闭操作后调用。deregister在当前注册的EventLoop的注销操作之后调用。read读取数据write写入数据flush刷新到pipeline总结通过这篇文章,我们可以了解Netty中的几个重要概念,EventLoopGroup的基本概念,Netty中channel的概念,Netty中pipeline流的概念!