Netty深入分析
Fashion-liu
这个作者很懒,什么都没留下…
展开
-
自顶向下深入分析Netty(四)--优雅退出机制
4.5 Netty优雅退出机制你也许已经习惯了使用下面的代码,使一个线程池退出: bossGroup.shutdownGracefully();那么它是如何工作的呢?由于bossGroup是一个线程池,线程池的关闭要求其中的每一个线程关闭。而线程的实现是在SingleThreadEventExecutor类,所以我们将再次回到这个类,首先看其中的shutdownGrace转载 2017-06-16 16:37:00 · 3248 阅读 · 0 评论 -
自顶向下深入分析Netty(九)--ByteBuf源码分析
9.4 ByteBuf源码分析9.4.1 类图ByteBuf的子类实现非常多,其中关键的实现类如下:ByteBuf类图可以使用两种方式对ByteBuf进行分类:按底层实现方式和按是否使用对象池。按底层实现HeapByteBufHeapByteBuf的底层实现为JAVA堆内的字节数组。堆缓冲区与普通堆对象类似,位于JVM堆内存区,可由GC回转载 2017-06-16 17:16:45 · 578 阅读 · 0 评论 -
自顶向下深入分析Netty(九)--引用计数
在前文中介绍了ByteBuf的概念和使用,本文进一步讲解背后的引用计数特性。9.3 引用计数服务端的网络通讯应用在处理一个客户端的请求时,基本都需要创建一个缓冲区ByteBuf,直到将字节数据解码为POJO对象,该缓冲区才不再有用。由此可知,当面对大量客户端的并发请求时,如果能有效利用这些缓冲区而不是每次都创建,将大大提高服务端应用的性能。或许你会有疑问:既然已经有了JAVA的转载 2017-06-16 17:15:59 · 931 阅读 · 0 评论 -
自顶向下深入分析Netty(九)--ByteBuf
Netty架构模式在本节之前,该系列文章已经自顶向下分析了Netty的基本组件:EventLoop,Channel和ChannelHandler,而本节将分析最后一个组件:字节缓冲区ByteBuf,可认为是图中subReactor与read和send之间的部分。9.1 ByteBuf总述引入缓冲区是为了解决速度不匹配的问题,在网络通讯中,CPU处理数据的速度大大快于转载 2017-06-16 17:15:14 · 507 阅读 · 0 评论 -
自顶向下深入分析Netty(八)-- LengthFieldBasedFrameDecoder
(本文是上一节的节选,已读可略过)Netty中,基于长度字段的消息帧解码器LengthFieldBasedFrameDecoder可根据数据包中的长度字段动态的解码出消息帧。一个推荐的二进制传输协议可设计为如下格式: +----------+------+----------+------+ | 头部长度 | 头部 | 数据长度 | 数据 | +--------转载 2017-06-16 17:14:30 · 387 阅读 · 0 评论 -
自顶向下深入分析Netty(八)--ChannelHandler
8.1 总述由第七节的讲述可知ChannelHandler并不处理事件,而由其子类代为处理:ChannelInboundHandler拦截和处理入站事件,ChannelOutboundHandler拦截和处理出站事件。ChannelHandler和ChannelHandlerContext通过组合或继承的方式关联到一起成对使用。事件通过ChannelHandlerContext主动调用如f转载 2017-06-16 17:08:23 · 3942 阅读 · 0 评论 -
自顶向下深入分析Netty(七)--ChannelHandlerContext源码实现
7.2.2 ChannelHandlerContext7.2.2.1 AbstractChannelHandlerContextAbstractChannelHandlerContext的类签名如下: abstract class AbstractChannelHandlerContext extends DefaultAttributeMap转载 2017-06-16 17:07:25 · 2629 阅读 · 0 评论 -
自顶向下深入分析Netty(七)--ChannelPipeline和ChannelHandler总述
Netty架构模式像以往一样,继续回顾这幅图。目前为止,我们学习了Netty的EventLoop、Channel以及ChannelFuture,还差最后两个部分:ByteBuf和ChannelHandler。ByteBuf作为通道读写数据的缓冲区,Channel底层数据的读写细节正是由ByteBuf完成。ChannelHandler作为处理各种事件的处理器,为用户提供实际的业务逻辑处理转载 2017-06-16 17:06:35 · 494 阅读 · 0 评论 -
自顶向下深入分析Netty(七)--ChannelPipeline源码实现
7.2 源码分析7.2.1 ChannelPipeline首先看ChannelPipeline接口的关键方法,相似方法只列出一个: ChannelPipeline addLast(String name, ChannelHandler handler); ChannelPipeline remove(ChannelHandler handler); Cha转载 2017-06-16 17:05:28 · 460 阅读 · 1 评论 -
自顶向下深入分析Netty(六)--Channel源码实现
6.2 Channel实现Netty_Channel类图Channel的类图比较清晰。我们主要分析NioSocketChannel和NioServerSocketChannel这两条线。6.2.1 AbstractChannel首先看其中的字段: private final Channel parent; // 父Channel p转载 2017-06-16 17:04:23 · 1046 阅读 · 0 评论 -
自顶向下深入分析Netty(六)--Channel总述
Netty架构模式回顾这幅图,目前为止,我们明白了两个Reactor、acceptor以及异步结果的原理。在这一章中,我们将分析图中的箭头部分,将各部件连接起来。进行连接的关键部件正是本章的主角Channel,Channel是网络Socket进行联系的纽带,可以完成诸如读、写、连接、绑定等I/O操作。6.1 总述6.1.1 ChannelJDK中的Channel转载 2017-06-16 17:02:30 · 1467 阅读 · 0 评论 -
自顶向下深入分析Netty(五)--Future
Netty架构模式再次回顾这幅图,在上一章中,我们分析了Reactor的完整实现。由于Java NIO事件驱动的模型,要求Netty的事件处理采用异步的方式,异步处理则需要表示异步操作的结果。Future正是用来表示异步操作结果的对象,Future的类签名为: public interface FutureV>;其中的泛型参数V即表示异步结果的类型。5.1 总转载 2017-06-16 17:01:47 · 2397 阅读 · 1 评论 -
自顶向下深入分析Netty(一)--预备知识
netty是基于Java NIO封装的网络通讯框架,只有充分理解了Java NIO才能理解好netty的底层设计。Java NIO有几个重要的概念Channel,Buffer,Selector。NIO是基于Channel和Buffer操作的,数据只能通过Buffer写入到Channel或者从Channel读出数据到Buffer中。Selector可以监听多个通道的事件(连接打开,数据到达),这样便转载 2017-06-16 16:17:52 · 1173 阅读 · 0 评论 -
自顶向下深入分析Netty(二)--线程模型
netty线程模型上面这幅图描述了netty的线程模型,其中mainReacotor,subReactor,Thread Pool是三个线程池。mainReactor负责处理客户端的连接请求,并将accept的连接注册到subReactor的其中一个线程上;subReactor负责处理客户端通道上的数据读写;Thread Pool是具体的业务逻辑线程池,处理具体业务。2.1 R转载 2017-06-16 16:27:44 · 923 阅读 · 1 评论 -
自顶向下深入分析Netty(三)--Bootstrap源码分析
长文预警,本文为源码分析部分,夹杂大量源码可能会引起不适,请选择性阅读。如果你只想知道Bootstrap的使用,可以阅读前一篇文章:自顶向下深入分析Netty(三)--Bootstrap2.源码分析Bootstrap类图首先看Bootstrap类图,可见类图比较简单。在分析时也使用自顶向下的方法,首先分析顶层的AbstractBootstrap,然后分析其子类B转载 2017-06-16 16:33:12 · 665 阅读 · 0 评论 -
自顶向下深入分析Netty(四)--EventLoop-1
netty线程模型我们再次回顾这幅图,通过先前的讲解,现在是不是亲切很多了。图中绿色的acceptor应该是你最熟悉的部分,之前我们在ServerBootstrap中进行了详细分析。我们知道了mainReactor是一个线程池,处理Accept事件负责接受客户端的连接;subReactor也是一个线程池,处理Read(读取客户端通道上的数据)、Write(将数据写入到客户端通道上)等事转载 2017-06-16 16:34:31 · 891 阅读 · 0 评论 -
自顶向下深入分析Netty(四)--EventLoop-2
4.4 线程4.4.1 AbstractExecutorServiceAbstractExecutorService是JDK并发包中的类,实现了ExecutorService中的submit()和invoke*()方法,关键实现是其中的newTaskFor()方法,使用FutureTask包装一个Ruannble对象和结果或者一个Callable对象。注意,这个方法是一个prote转载 2017-06-16 16:35:23 · 670 阅读 · 0 评论 -
自顶向下深入分析Netty(三)--Bootstrap
Netty的一种线程模型本文开始分析Netty的源码,由于目标是自顶向下分析,在这一节将分析Netty是如何构建起如上图所示的整体框架。首先将使用一个示例展示怎么使用Bootstarp构建服务端应用,然后将深入源码了解底层机制和原理。1.使用示例首先使用Netty构造如图所示的框架,源码如下: // 指定mainReactor EventLoopG转载 2017-06-16 16:28:46 · 1143 阅读 · 0 评论