![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
netty
文章平均质量分 79
自带buff
这个作者很懒,什么都没留下…
展开
-
netty源码解析(4.0)-29 Future模式的实现
Future模式是一个重要的异步并发模式,在JDK有实现。但JDK实现的Future模式功能比较简单,使用起来比较复杂。Netty在JDK Future基础上,加强了Future的能力,具体体现在:更加简单的结果返回方式。在JDK中,需要用户自己实现Future对象的执行及返回结果。而在Netty中可以使用Promise简单地调用方法返回结果。 更加灵活的结果处理方式。JDK中只提供了主...原创 2019-11-20 15:13:18 · 381 阅读 · 0 评论 -
netty源码解析(4.0)-28 ByteBuf内存池:PooledByteBufAllocator-把一切组装起来
PooledByteBufAllocator负责初始化PoolArena(PA)和PoolThreadCache(PTC)。它提供了一系列的接口,用来创建使用堆内存或直接内存的PooledByteBuf对象,这些接口只是一张皮,内部完全使用了PA和PTC的能力。初始化过程分两个步骤,首先初始化一系列的默认参数,然后初始化PTC对象和PA数组。默认参数和它们的值 DEFAULT_...原创 2019-11-05 16:13:09 · 393 阅读 · 0 评论 -
netty源码解析(4.0)-27 ByteBuf内存池:PoolArena-PoolThreadCache
前面两章分析的PoolChunk和PoolSubpage,从功能上来说已经可以直接拿来用了。但直接使用这个两个类管理内存在高频分配/释放内存场景下会有性能问题,PoolChunk分配内存时算法复杂度最高的是allocateNode方法,释放内存时算法复杂度最高的是free方法。 PoolChunk中二叉树的高度是maxOrder, 那么算法负责度是O(maxOrder),netty默认的ma...原创 2019-10-29 15:27:05 · 168 阅读 · 0 评论 -
netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage
PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以subpage为单位分配出去。PoolSubpage就是用来管理subpage的。 一个page会被分割成若干个大小相同的subpage,subpage的的大小是elemSize。elemSi...原创 2019-10-22 16:04:39 · 126 阅读 · 0 评论 -
netty源码解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法。分析代码之前,先熟悉一些重要的概念:page: 页,一个页是可分配的最小的内存块单元,页的大小:pageSize = 1 << n (n <= 12)。 chunk: 块,块是多个页的集合。chunkSize是块中所有page的p...原创 2019-10-16 10:07:04 · 168 阅读 · 0 评论 -
netty源码解析(4.0)-21 ByteBuf的设计原理
ByteBufAbstractByteBufEmptyByteBufSwappedByteBufWrappedByteBufAbstractByteBufAbstractReferenceCountedByteBufCompositeByteBufFixedCompositeByteBufPooledByteBufReadOnlyByteBufferBufCompositeByteBufWra...原创 2019-10-02 15:38:00 · 175 阅读 · 0 评论 -
netty源码解析(4.0)-16 ChannelHandler概览
本章开始分析ChannelHandler实现代码。ChannelHandler是netty为开发者提供的实现定制业务的主要接口,开发者在使用netty时,最主要的工作就是实现自己的ChannelHandler。ChannelHandler在设计上需要和ChannelPipeline配合共同实现pipeline的事件传递能力,这要求ChannelHandler需要实现一些固定的基本功能。由于...原创 2019-09-03 16:56:26 · 143 阅读 · 0 评论 -
netty源码解析(4.0)-17 ChannelHandler: IdleStateHandler实现
io.netty.handler.timeout.IdleStateHandler功能是监测Channel上read, write或者这两者的空闲状态。当Channel超过了指定的空闲时间时,这个Handler会触发一个IdleStateEvent事件。 在第一次检测到Channel变成active状态时向EventExecutor中提交三个延迟任务: ReaderIdleT...原创 2019-09-17 16:03:23 · 228 阅读 · 0 评论 -
netty源码解析(4.0)-18 ChannelHandler: codec--编解码框架
编解码框架和一些常用的实现位于io.netty.handler.codec包中。 编解码框架包含两部分:Byte流和特定类型数据之间的编解码,也叫序列化和反序列化。不类型数据之间的转换。 下图是编解码框架的类继承体系: 其中MessageToByteEncoder和ByteToMessageDecoder是实现了序列化和反序列化框架。 MessageToMessage是不同类...原创 2019-09-24 14:56:24 · 182 阅读 · 0 评论 -
netty源码解析(4.0)-19 ChannelHandler: codec--常用编解码实现
数据包编解码过程中主要的工作就是:在编码过程中进行序列化,在解码过程中从Byte流中分离出数据包然后反序列化。在MessageToByteEncoder中,已经解决了序列化之后的问题,ByteToMessageDecoder中已经部分第解决了从Byte流中分离出数据包的问题。实现具体的数据包编解码,只需要实现MessageToByteEncoder的encode和ByteToMessageDe...原创 2019-09-26 20:43:34 · 178 阅读 · 0 评论 -
netty源码解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端
本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端。通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决的一些关键问题。 本周章涉及到的代码可以从github上下载:https://github.com/brandonlyg/tinytransport.git。设计协议 本章...原创 2019-09-30 13:49:34 · 361 阅读 · 0 评论 -
netty源码解析(4.0)-22 ByteBuf的I/O
整个ByteBuf框架的抽象实现分为两部分:ByteBuf接口的抽象实现:AbstractByteBuf, AbstractReferenceCountedByteBuf。分配器ByteBufAllocator接口的抽象实现: AbstractByteBufAllocator。ByteBuf接口的抽象实现AbstractByteBuf&...原创 2019-10-04 10:13:11 · 170 阅读 · 0 评论 -
netty源码解析(4.0)-23 ByteBuf内存管理:分配和释放
ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机。 内存分配分两个阶段: 第一阶段,初始化时分配内存。第二阶段: 内存不够用时分配新的内存。ByteBuf抽象层没有定义第一阶段的行为,但定义了第二阶段的方法: public abstract ByteBuf capacity(int newCapacity) 这个方法负责分配一个长度为...原创 2019-10-05 15:14:50 · 315 阅读 · 0 评论 -
netty源码解析(4.0)-24 ByteBuf基于内存池的内存管理
io.netty.buffer.PooledByteBuf<T>使用内存池中的一块内存作为自己的数据内存,这个块内存是PoolChunk<T>的一部分。PooledByteBuf<T>是一个抽象类型,它有4个派生类:PooledHeapByteBuf,PooledUnsafeHeapByteBuf 使用堆内存的PooledByteBuffer<by...原创 2019-10-09 15:54:44 · 231 阅读 · 0 评论 -
netty源码解析(4.0)-15 Channel NIO实现:写数据
写数据是NIO Channel实现的另一个比较复杂的功能。每一个channel都有一个outboundBuffer,这是一个输出缓冲区。当调用channel的write方法写数据时,这个数据被一系列ChannelOutboundHandler处理之后,它被放进这个缓冲区中,并没有真正把数据写到socket channel中。然后再调用channel的flush方法,flush会把outboundB...原创 2019-08-29 16:01:55 · 486 阅读 · 0 评论 -
netty源码解析(4.0)-14 Channel NIO实现:读取数据
本章分析Nio Channel的数据读取功能的实现。 Channel读取数据需要Channel和ChannelHandler配合使用,netty设计数据读取功能包括三个要素:Channel, EventLoop和ChannelHandler。Channel有个read方法,这个方法不会直接读取数据,它的作用是通知持有当前channel的eventLoop可以从这个这个channel读取数据了...原创 2019-08-22 16:31:09 · 536 阅读 · 0 评论 -
netty源码解析(4.0)-13 Channel NIO实现: 关闭和清理
Channel提供了3个方法用来实现关闭清理功能:disconnect,close,deregister。本章重点分析这个3个方法的功能的NIO实现。 disconnect实现: 断开连接 disconnect方法的调用栈如下:1 io.netty.channel.AbstractChannel#disconnect()2 io.netty.channel.Defau...原创 2019-08-20 14:57:41 · 800 阅读 · 0 评论 -
netty源码解析(4.0)-3 Channel的抽象实现
AbstractChannel和AbstractUnsafe抽象类io.netty.channel.AbstractChannel从本章开始,会有大量的篇幅涉及到代码分析。为了能够清晰简洁的地说明代码的结构和功能,我会用代码注释+独立段落的方式加以呈现。 所以,为你能更好地理解代码,请不要忽略代码中黑体字注释。AbstractChannel和AbstractUnsafe之间的关系...原创 2018-12-21 21:56:53 · 1894 阅读 · 0 评论 -
netty源码解析(4.0)-2 Chanel的接口设计
全名: io.netty.channel.ChannelChannel内部定义了一个Unsafe类型,Channel定义了对外提供的方法,Unsafe定义了具体实现。我把Channel定义的的方法分为三种类型:辅助方法。 outbound方法 inbound方法下面依次对这三种方法给予详细说明:1. 辅助方法 方法 说明 ...原创 2018-12-17 23:14:03 · 114 阅读 · 0 评论 -
netty源码解析(4.0)-4 线程模型-概览
netty线程体系概览netty的高并发能力很大程度上由它的线程模型决定的,netty定义了两种类型的线程:I/O线程: EventLoop, EventLoopGroup。一个EventLoopGroup包含多个EventLoop, 每个Channel会被注册到一个,一个EventLoop中, 一个EventLoop可以包含多个Channel。Channel的Unsafe实例的方法必须要...原创 2018-12-24 23:16:43 · 191 阅读 · 0 评论 -
ThreadPoolExecutor代码解析
派生体系java.util.concurrent ThreadPoolExecutor AbstractExecutorService ExecutorService Executor 这个类是Executor框的核心实现,它的名字向我们表明,它是使用thread pool实现的。这个thread pool主要解决了两个问题:执行大量...原创 2019-01-02 21:52:33 · 165 阅读 · 0 评论 -
netty源码解析(4.0)-5 线程模型-EventExecutorGroup框架
上一章讲了EventExecutorGroup的整体结构和原理,这一章我们来探究一下它的具体实现。EventExecutorGroup和EventExecutor接口io.netty.util.concurrent.EventExecutorGroupjava.util.concurrent.ScheduledExecutorServiceEventExecutorGroup继承了...原创 2019-01-08 15:49:09 · 982 阅读 · 0 评论 -
netty源码解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)
接口定义io.netty.channel.EventLoopGroup extends EventExecutorGroup 方法 说明 ChannelFuture register(Channel channel) 把一个channel注册到一个EventLoop ChannelFuture reg...原创 2019-01-15 13:48:18 · 272 阅读 · 0 评论 -
netty源码解析(4.0)-7 线程模型-IO线程EventLoopGroup和NIO实现(二)
把NIO事件转换成对channel unsafe的调用或NioTask的调用processSelectedKeys()方法是处理NIO事件的入口:private void processSelectedKeys() {if (selectedKeys != null) {processSelectedKeysOptimized();} else {processSelect...原创 2019-01-23 09:30:15 · 219 阅读 · 1 评论 -
netty源码解析(4.0)-8 ChannelPipeline的设计
io.netty.channel.ChannelPipeline设计原理 上图中,为了更直观地展示事件处理顺序, 故意有规律地放置两种handler的顺序,实际上ChannelInboundHandler和ChanneOutboundHandler的顺序可以是任意,取决于用户调用add方法把handler方在哪里。 ChannelPipeline的特性: ...原创 2019-01-30 11:01:33 · 158 阅读 · 0 评论 -
netty源码解析(4.0)-9 ChannelPipleline的默认实现-链表管理
io.netty.channel.DefaultChannelPipeline implements ChannelPiplelineDefaultChannelPiple给出了ChannelPipleline的默认实现。ChannelPipleline是一个双向链表,本章的内容是分析默认实现中双向链表的实现。双向列表的的数据结构 DefaultChannelPiple使...原创 2019-03-28 16:04:28 · 146 阅读 · 0 评论 -
netty源码解析(4.0)-10 ChannelPipleline的默认实现--事件传递及处理
事件触发、传递、处理是DefaultChannelPipleline实现的另一个核心能力。在前面在章节中粗略地讲过了事件的处理流程,本章将会详细地分析其中的所有关键细节。这些关键点包括:事件触发接口和对应的ChannelHandler处理方法。 inbound事件的传递。 outbound事件的传递。 ChannelHandler的eventExecutor的分配。 ...原创 2019-03-28 16:08:56 · 263 阅读 · 0 评论 -
netty源码解析(4.0)-11 Channel NIO实现-概览
结构设计 Channel的NIO实现位于io.netty.channel.nio包和io.netty.channel.socket.nio包中,其中io.netty.channel.nio是抽象实现,io.netty.channel.socket.nio最终实现。下面是Channel NIO相关类的派生图: NIO实现最终派生出3个类型NioServerSocketChannel实...原创 2019-07-29 16:06:12 · 166 阅读 · 0 评论 -
netty源码解析(4.0)-12 Channel NIO实现:channel初始化
创建一个channel实例,并把它register到eventLoopGroup中之后,这个channel然后处于inactive状态,仍然是不可用的。只有在bind或connect方法调用成功之后才能正常。因此bind或connect算是channel初始化的最后一步,本章这就重点分析这两个功能的实现。 接下来的代码分析如果没有特别说明,都是以NioSocketChannel为例。...原创 2019-08-14 16:32:09 · 150 阅读 · 0 评论 -
netty源码解析(4.0)-1 核心架构
netty是java开源社区的一个优秀的网络框架。使用netty,我们可以迅速地开发出稳定,高性能,安全的,扩展性良好的服务器应用程序。netty封装简化了在服务器开发领域的一些有挑战性的问题:jdk nio的使用;多线程并发;扩展性。它还提供了多种应用层协议的支持:http/https/websock, protobuf, 自定义协议, 简化了服务器协议的开发。netty是一个基于事件驱动的框...原创 2018-12-10 23:14:07 · 202 阅读 · 0 评论