Netty技术内幕-源码研究Netty5
基于Netty5.0,从内存篇(ByteBuf)、通道篇(Chanel)、ChannelPipeline、ChannelHandler、线程模型等角度深入剖析Netty的实现原理。
中间件兴趣圈
《RocketMQ技术内幕》一书作者、RocketMQ开源社区优秀布道师、CSDN2020博客之星TOP2,主打成体系剖析java中间件,已发布RocketMQ、Kafka、Dubbo、Sentinel、Canal、ElasticJob、ElasticSearch等15个专栏。
展开
-
Netty学习之旅----源码分析netty服务端初始化流程(Reactor主从模式实现)
本文以Netty服务端启动实例代码为视角,将Netty服务端的启动流程用序列图进行展开描述,清晰的剖析了Netty服务器端口绑定、主从Reactor线程模型、业务Handler编排细节。原创 2017-03-30 10:52:51 · 3890 阅读 · 0 评论 -
源码分析Netty系列
Netty源码研究专题(Netty源码学习之旅)目录1、ByteBuf内存篇1.1 ByteBuf内部结构与API学习 博文地址:http://blog.csdn.net/prestigeding/article/details/539807901.2 源码学习UnpooledHeapByteBuf、UnpooledDirectByteBuf 博文地址:http...原创 2017-01-02 12:56:36 · 16928 阅读 · 12 评论 -
Netty 学习之旅:ByteBuf 篇之 ByteBuf 内部结构与 API 学习
1、原生 ByteBuffer、ByteBuf 内部结构设计首先我们来回顾一下 java.nio.ByteBuffe r的内部结构设计。ByteBuffer 内部持有一个 byte[] bt, 再加上 position、limit、capacity、mark 四个属性。position 当前可用操作的位置,调用 get() 方法,返回 bt[postion] 处的值,如果是调用 pu...原创 2017-01-02 17:44:15 · 10287 阅读 · 1 评论 -
Netty学习之旅----ByteBuf源码解读之初探UnpooledHeapByteBuf、UnpooledDirectByteBuf
首先,我们再看一下 ByteBuf 的类设计图,从中更进一步了解ByteBuf。ByteBuf 继承自 ReferenceCounted,引用计数,也就是说 ByteBuf 的内存回收使用的是引用计数器来实现。UnpooledHeapByteBuf 是非池化的堆内存实现,而 UnpooledDirectByteBuf 是非池化的堆外内存(直接内存)。非池化的ByteBuf 就是利用完之...原创 2017-01-05 11:14:13 · 10000 阅读 · 2 评论 -
Netty学习之旅----源码分析Netty内存泄漏检测
1、图说Netty直接内存管理2、Netty 直接内存的使用示例 ByteBuf buf = Unpooled.directBuffer(512); System.out.println(buf); // SimpleLeakAwareByteBuf(UnpooledUnsafeDirectByteBuf(ridx: 0, wid...原创 2017-01-08 12:56:47 · 6952 阅读 · 0 评论 -
Netty学习之旅:源码分析Netty内存池分配基础数据结构(PoolArena、PoolChunk、PoolSubpage)
1、Netty 内存分配基础数据结构Netty 预先申请一大块连续的内存(用 PoolArena 类表示),然后每一 PoolArena 包含一系列的 Chunk, 用 PoolChunk 表示,然后每一个 Chunk 包含一列的 PoolSubpage,每个 PoolSubpage 由大小相等的块(Region)组成,每个 PoolSubpage 块大小由第一次从 PoolSubpage申请...原创 2017-01-18 10:15:08 · 4892 阅读 · 3 评论 -
Netty学习之旅----源码分析内存分配与释放原理
Netty 内存分配优先从线程本地缓冲池中分配,然后才是从 PoolChunk 中分配。线程池缓存的不仅是使用的内存,比如分配的内存区域(PoolSubpage),PooledByteBuf 对象本身也被缓存,关于本地线程分配缓存,下文会有专题进行研究与学习。1、源码分析Netty内存分配(不考虑线程本地分配)1.1 入口方法:PooledByteBufAllocator#newHeapB...原创 2017-01-23 11:29:12 · 5363 阅读 · 4 评论 -
Netty学习之旅------源码分析Netty线程本地分配机制与PooledByteBuf线程级对象池原理分析
在讲上篇Netty内存分配的时候,没有考虑本地线程的缓存,也就是Netty在分配内存时,首先尝试从线程本地缓存中去申请,如果申请失败,才从全局分配。本章就重点分析线程缓存相关的实现。首先我们将目光投向PooledByteBufAllocato的final PoolThreadLocalCachethreadCache;该类实现的机制类似ThreadLocal,我们重点看一下1、Poole...原创 2017-01-24 17:28:00 · 2995 阅读 · 0 评论 -
Netty学习之旅----ThreadLocal原理分析与性能优化思考(思考篇)
1、java.lang.ThreadLocal概况ThreadLocal,本地线程变量,每个线程保留着一个共享变量的副本。其实我不太认可每个线程保存共享变量的一个副本这个说法,而是ThreadLocal是线程上下文环境的一种实现方式而已。就以数据库事务这一常用场景来举例说明,比如每个线程需要访问数据库,就需要获取数据库的连接Connection对象,在实际中,我们会用数据库连接池来重复利用Co...原创 2017-02-09 11:49:26 · 8383 阅读 · 0 评论 -
Netty学习之旅------Netty Channel 概述
1、Channel官方概述先附上官方关于Channel的介绍。/** * A nexus to a network socket or a component which is capable of I/O * operations such as read, write, connect, and bind. * <p> * A channel provides a...原创 2017-02-09 15:45:05 · 7933 阅读 · 4 评论 -
Netty学习之旅------线程模型前置篇Reactor反应堆设计模式实现(基于java.nio)
1、Reactor反应堆设计模式1.1 单线程模型 单线程模型Reactor(此图来源与网络)下面以java nio为基础,实现Reactor模型。Nio服务端代码:package threadmode.r1;import java.io.IOException;import java.net.InetSocketA...原创 2017-02-14 15:29:17 · 7337 阅读 · 10 评论 -
Netty学习之旅------图说Netty线程模型
1、图说Netty线程模型提到Netty的线程模型,我们不得不再重复提到主从Reactor线程模型,Netty线程模型基本上基于主从Reactor模型的实现方式,Netty线程模型将从如下两个图进行展开:Reactor主从线程模型Netty服务端示例代码。关于Reactor主从多线程模型的讲解,请重点关注Netty 线程模型前置篇,Reactor主从模式源码实现,从...原创 2017-02-21 19:26:04 · 3472 阅读 · 3 评论 -
Netty学习之旅------源码分析ChannelPipeline实现原理
本文主要从如下方面展示:Nettybind源码分析 ChannelPipline链式请求源码分析1、NettyServerBootstrapbind源码跟踪本文将重点分析Netty服务端绑定端口流程。1.1入口程序1.2 AbstractBootstarp的doBind方法初始化一个通道,并注册,如果注册失败,直接返回。 如果初始化并立即注册成功,执行...原创 2017-02-28 20:43:14 · 3647 阅读 · 2 评论 -
Netty学习之旅------源码分析Netty解码编码器实现原理
非阻塞IO,存在一个特殊的问题,就是半包问题。Netty 为了屏蔽底层的半包问题,提供编码解码器。编码解码器在 Netty 里编织为一个个 Handler。本文重点分析一下消息解码器 ByteToMessageDecoder 的实现原理,该类的职责就是将字节流中解析为一个一个有效的客户端请求报文。1、ByteToMessageDecoder 类概述/** * A {@link Chan...原创 2017-03-04 17:53:38 · 3769 阅读 · 3 评论 -
Netty学习之旅------高仿Dubbo服务调用模型、私有协议实现、编码解码器使用实践
1、本文实现如下功能1、客户端与服务端基于单一长连接进行通信,客户端一条连接被多个线程使用。2、实现私有协议 请求协议 : 协议头:4字节的请求序列号 2字节的请求类型 2字节数据包长度 数据部分: 服务调用:2字节请求服务名长度 若干字节请求服务名 2字节请求参数长度 若干字节参数。 ...原创 2017-03-09 11:16:18 · 3191 阅读 · 0 评论 -
Netty学习之旅------再谈线程模型之源码分析NioEventLoopGroup、SingleThreadEventExecutor
1、线程模型总结Netty线程模型基于主从Reactor模型;Channel会绑定一个线程模型(EventLoopGroup),与该通道的读,写等事件都在一个EventLoopGroup中执行,避免了Handler执行的线程安全问题。线程模型前置篇:Nio实现Reactor模式 图说netty线程模型2、源码分析NioEventLoopGroup初始化流程2.1 NioEven...原创 2017-03-21 16:29:42 · 8250 阅读 · 4 评论 -
Netty学习之旅------NioSocketChannel源码分析之读事件处理逻辑
本文基于上一篇Nett事件处理模型处理机制,深入分析了Netty网络读事件的核心处理机制,重点阐述了Netty读事件处理步骤,读事件传播触发,从通道接收数据时,缓存区大小如何分配等关键问题。原创 2017-03-23 16:00:29 · 3230 阅读 · 0 评论 -
Netty学习之旅------写事件处理NioSocketChannel、ChannelOutbondBuffer源码分析
本文继续就Netty处理网络事件相关内容进行展开,重点分析Netty是如何处理写事件的。程序入口还是在NioEventLoop的processSlectedKey(SelectionKey k, AbstractNioChannel ch)。最终将执行AbstractNioChannel$AbstractNioUnsafe 的forceFlush()方法。1、AbstractNioCh...原创 2017-03-28 17:01:24 · 4460 阅读 · 0 评论