
框架-Netty
文章平均质量分 67
Netty 4.x相关的源码解读,以及遇到的相关问题,会不停的更新
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
九师兄
可免费问问题,可以一次订阅,终身免费问问题。工作多年遇到的问题,与一些总结,注意事项等,有些是源码级别的讲解,同时整个博客是成体系的,里面有很多连接互相连接,问题都是拆开的,能让大家遇到问题的时候方便的解决问题,或者提供思路。也可以单独找我解决问题。
展开
-
【netty】netty ResourceLeakDetector 资源泄露检测
当你通过 ChannelInboundHandler.channelRead(…) 或者 ChannelOutboundHandler.write(…) 来处理数据,重要的是在处理资源时要确保资源不要泄漏。Netty 使用引用计数器来处理池化的 ByteBuf。所以当 ByteBuf 完全处理后,要确保引用计数器被调整。引用计数的权衡之一是用户时必须小心使用消息。当 JVM 仍在 GC(不知道有这样的消息引用计数)这个消息,以至于可能是之前获得的这个消息不会被放回池中。原创 2024-06-26 00:15:00 · 560 阅读 · 0 评论 -
【netty】netty-all 4.1.20.Final 无法关闭的一个bug
今天同事想写一个小demo代码,然后希望运行后,关闭,因为他想代码中启动和停止相关的服务。然后他升级版本,停止正常了,我降低版本出现了一样的错误,这个应该就是版本问题导致的。然后我让他把代码发我,然后我运行正常结束,然后怀疑版本问题,这个引入的如下。可以看到该执行的都执行了,但是还是没有退出。原创 2024-06-23 11:10:51 · 248 阅读 · 0 评论 -
Protobuf报错Protocol message tag had invalid wire type
做李林峰的protobuf版本的图书订购服务这个案例,使用protobuf报错如下io.netty.handler.codec.DecoderException: com.google.protobuf.InvalidProtocolBufferException$InvalidWireTypeException: Protocol message tag had invalid wire ty...原创 2020-07-04 11:42:26 · 16417 阅读 · 0 评论 -
【netty】Netty堆外内存泄露排查盛宴
遇到堆外内存泄露不要怕,仔细耐心分析,总能找到思路,要多看日志,多分析。如果使用了 Netty 堆外内存,那么可以自行监控堆外内存的使用情况,不需要借助第三方工具,我们是使用的“反射”拿到的堆外内存的情况。逐渐缩小范围,直到 Bug 被找到。当我们确认某个线程的执行带来 Bug 时,可单步执行,可二分执行,定位到某行代码之后,跟到这段代码,然后继续单步执行或者二分的方式来定位最终出 Bug 的代码。这个方法屡试不爽,最后总能找到想要的 Bug。转载 2022-10-13 21:27:33 · 1254 阅读 · 0 评论 -
【netty】Netty并发工具-Promise
1.概述转载并且补充:从源码上理解Netty并发工具-Promise2.前提最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现甚至可以用苛刻来形容。另外,Netty提供的工具类也是相当优秀,可以开箱即用。这里分析一下个人比较喜欢的领域,并发方面的一个Netty工具模块 - Promise。环境版本:Netty:4.1.44.FinalJDK1.83.Promise简介Promise,中文翻译为承诺或者许诺,含义是人与.转载 2022-02-12 20:27:13 · 2182 阅读 · 1 评论 -
【netty】netty HashedWheelTimer 延时队列
1.概述想要研究这个是因为 【Flink】Flink 写入 Clickhouse 大对象直接进入老年代 导致OOM 遇到了这个问题。在这个问题中,我将时间轮改小了 时间轮 512改成16个Netty中提供的HashedWheelTimer时间轮算法的也是延迟队列一种。这个类用来计划执行非精准的I/O超时。1.1 结构模型下方图示阐述了大致的结构模型2.类介绍2.1 构造方法 public HashedWheelTimer( ThreadFactory thr.原创 2022-01-04 23:04:50 · 582 阅读 · 3 评论 -
【netty】Netty粘包问题TooLongFrameException: Adjusted frame length exceeds
1.概述此问题参考:【Flink】Flink 任务报错 akka remote connection TooLongFrameException adjusted frame length discarded我这里主要是想再现这个问题。服务器代码初始化部分ServerBootstrap b = new ServerBootstrap(); b.option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE原创 2021-12-23 21:25:38 · 5015 阅读 · 0 评论 -
95-38-150-Buffer-CompositeByteBuf
1. 概述 CompositeByteBuf实际就是个ByteBuf的包装器,它将多个ByteBuf组合成一个集合,然后对外提供统一的ByteBuf接口。2.继承关系原创 2021-09-26 22:46:16 · 194 阅读 · 0 评论 -
95-38-140-Buffer-MappedByteBuffer
MappedByteBuffer内存映射文件:操作内存,内存帮我们写入到磁盘/** * A direct byte buffer whose content is a memory-mapped region of a file. * * <p> Mapped byte buffers are created via the {@link * java.nio.channels.FileChannel#map FileChannel.map} method. This class.原创 2021-09-26 22:45:43 · 201 阅读 · 0 评论 -
95-38-055-Buffer-UnpooledDirectByteBuf
1. 总述1.1 局部图1.2 概述Netty的UnpooledDirectByteBuf在NIO的DirectByteBuf上采用组合的方式进行了封装,屏蔽了对程序员不友好的地方,并使其符合Netty的ByteBuf体系。使用与UnpooledHeapByteBuf相同的顺序进行分析,首先看成员变量:private final ByteBufAllocator alloc; // 分配器 private ByteBuffer buffer; // 底层NIO直接ByteBuff原创 2021-09-25 10:07:08 · 191 阅读 · 0 评论 -
95-38-050-Buffer-UnpooledHeapByteBuf
1. 总述1.1 局部图1.2 概述该Bytebuf的底层为不使用对象池技术的JAVA堆字节数组。2.私有字段首先看其中的成员变量: /** * 分配器 */ private final ByteBufAllocator alloc; /** 底层字节数组 **/ byte[] array; /** NIO的ByteBuffer形式 **/ private ByteBuffer tmpNioBuf;只需要着重关注array变量原创 2021-09-24 19:54:44 · 209 阅读 · 0 评论 -
95-38-045-Buffer-UnpooledByteBuf
文章目录1. 总述1.1 拓扑图1.2 局部图1. 总述1.1 拓扑图1.2 局部图原创 2021-09-24 19:54:14 · 192 阅读 · 0 评论 -
95-38-040-Buffer-AbstractReferenceCountedByteBuf引用计数
1. 总述1.1 拓扑图1.2 概述 从名字可以推断,该抽象类实现引用计数相关的功能。引用计数的功能简单理解就是:当需要使用一个对象时,计数加1;不再使用时,计数减1。 如何实现计数功能呢?考虑到引用计数的多线程使用情形,一般情况下,我们会选择简单的AtomicInteger作为计数,使用时加1,释放时减1。这样的实现是没有问题的,但Netty选择了另一种内存效率更高的实现方式:volatile + FieldUpdater。2. 私有变量 private static final R.原创 2021-09-23 20:58:09 · 171 阅读 · 0 评论 -
95-38-035-Buffer-AbstractByteBuf
1. ByteBuf总述1.1 拓扑图1.2 概述 抽象基类AbstractByteBuf中定义了ByteBuf的通用操作,比如读写索引以及标记索引的维护、容量扩增以及废弃字节丢弃等等。2. 私有变量 /** 读索引 **/ int readerIndex; /** 写索引 */ int writerIndex; /** 标记读索引 **/ private int markedReaderIndex; /** 标记写索引 **/ p.原创 2021-09-22 21:27:16 · 173 阅读 · 0 评论 -
95-38-030-Buffer-Java NIO中-关于DirectBuffer,HeapBuffer的疑问
1. 说明本文摘要: https://www.zhihu.com/question/573740682.疑问Java NIO中,关于DirectBuffer,HeapBuffer的疑问?DirectBuffer 属于堆外存,那应该还是属于用户内存,而不是内核内存?FileChannel 的read(ByteBuffer dst)函数,write(ByteBuffer src)函数中,如果传入的参数是HeapBuffer类型,则会临时申请一块DirectBuffer,进行数据拷贝,而不是.原创 2021-09-22 21:26:48 · 258 阅读 · 0 评论 -
95-38-025-Buffer-Buffer1
本文是转载的,忘记转载哪个了。上一篇文章我们概要介绍了Netty的原理及结构,下面几篇文章我们开始对Netty的各个模块进行比较详细的分析。Netty的结构最底层是buffer机制,这部分也相对独立,我们就先从buffer讲起。What:buffer简介buffer中文名又叫缓冲区,按照维基百科的解释,是"在数据传输时,在内存里开辟的一块临时保存数据的区域"。它其实是一种化同步为异步的机制,可以解决数据传输的速率不对等以及不稳定的问题。根据这个定义,我们可以知道涉及I/O(特别是I/O写)的地方,原创 2021-09-21 10:28:35 · 210 阅读 · 0 评论 -
95-38-025-Buffer-Buffer
1. ByteBuf总述 引入缓冲区是为了解决速度不匹配的问题,在网络通讯中,CPU处理数据的速度大大快于网络传输数据的速度,所以引入缓冲区,将网络传输的数据放入缓冲区,累积足够的数据再送给CPU处理。1.1 拓扑图1.2 Buffer的分类ByteBuf 的实现类有很多,可以通过两个维度去分类。维度1:是否是直接内存,还是堆上内存维度2:是否是池化的,池化的用完就会释放掉。这两个维度相乘,就得到了4种情况。注意:通过索引来访问Byte时,并不会改变真实的读索引与写索引,我.原创 2021-09-21 10:28:17 · 265 阅读 · 0 评论 -
95-36-220-ChannelHandler-RejectedExecutionHandlers
1. 拓扑图final类,顶级类public final class RejectedExecutionHandlers2. 概述拒绝执行处理器,意思是什么时候,不去执行用户的任务。原创 2021-09-21 10:27:30 · 184 阅读 · 0 评论 -
95-36-210-ChannelHandler-系统Channel-TimeoutHandler1
文章目录TimeoutHandlerTimeoutHandler在开发TCP服务时,一个常见的需求便是使用心跳保活客户端。而Netty自带的三个超时处理器IdleStateHandler,ReadTimeoutHandler和WriteTimeoutHandler可完美满足此需求。其中IdleStateHandler可处理读超时(客户端长时间没有发送数据给服务端)、写超时(服务端长时间没有发送数据到客户端)和读写超时(客户端与服务端长时间无数据交互)三种情况。这三种情况的枚举为:public enu原创 2021-09-21 10:25:38 · 164 阅读 · 0 评论 -
95-36-210-ChannelHandler-系统Channel-TimeoutHandler
文章目录1. 概述2. 继承体系3.IdleStateHandler3.1 典型构造方法3.2 初始化方法`initialize`3.3 销毁方法destroy3.4 核心的调度任务`ReaderIdleTimeoutTask`1. 概述 在开发TCP服务时,一个常见的需求便是使用心跳保活客户端。而Netty自带的三个超时处理器IdleStateHandler,ReadTimeoutHandler和WriteTimeoutHandler可完美满足此需求。其中IdleStateHandler可处理读超原创 2021-09-21 10:22:41 · 176 阅读 · 0 评论 -
95-36-200-ChannelHandler-系统Channel-LoggingHandler
1. 概述 日志处理器LoggingHandler是使用Netty进行开发时的好帮手,它可以对入站\出站事件进行日志记录,从而方便我们进行问题排查。2. 继承体系3.类签名@Sharable@SuppressWarnings({ "StringConcatenationInsideStringBufferAppend", "StringBufferReplaceableByString" })public class LoggingHandler extends ChannelDuplex.原创 2021-09-21 10:22:16 · 159 阅读 · 0 评论 -
95-36-110-ChannelHandler-ChannelDuplexHandler
1. 概述 ChannelDuplexHandler则同时实现了ChannelInboundHandler和ChannelOutboundHandler接口。如果一个所需的ChannelHandler既要处理入站事件又要处理出站事件,推荐继承此类。2. 继承体系至此,ChannelHandler的核心类已分析完毕,接下来将分析一些Netty自带的Handler。...原创 2021-09-21 09:14:18 · 813 阅读 · 0 评论 -
95-36-100-ChannelHandler-ChannelOutboundHandler
文章目录1. 概述2. 继承体系3.ChannelInboundHandler4.ChannelInboundHandlerAdapter1. 概述ChannelOutboundHandler处理出站事件:2. 继承体系3.ChannelInboundHandler// 类似的出站事件 void read(ChannelHandlerContext ctx) throws Exception;4.ChannelInboundHandlerAdapter 同理,ChannelOu原创 2021-09-20 14:14:46 · 208 阅读 · 0 评论 -
95-36-030-ChannelHandler-ChannelInboundHandler
文章目录1. 概述2. 继承体系3.ChannelInboundHandler4.ChannelInboundHandlerAdapter1. 概述 ChannelInboundHandler处理入站事件,以及用户自定义事件.2. 继承体系3.ChannelInboundHandler// 类似的入站事件void channeXXX(ChannelHandlerContext ctx) throws Exception;// 用户自定义事件void userEventTriggered原创 2021-09-19 13:46:18 · 179 阅读 · 0 评论 -
95-36-025-ChannelHandler-ChannelHandlerAdapter
文章目录1. 概述2. 继承体系3.isSharable1. 概述 2. 继承体系3.isSharable 作为ChannelHandler的默认实现,ChannelHandlerAdapter有个重要的方法isSharable(),代码如下:/** * Return {@code true} if the implementation is {@link Sharable} and so can be added * to different {@link Chann原创 2021-09-18 20:46:57 · 318 阅读 · 0 评论 -
95-36-020-ChannelHandler-ChannelHandler
文章目录1. 概述2. 继承体系3.**ChannelHandler**1. 概述 ChannelHandler并不处理事件,而由其子类代为处理:ChannelInboundHandler拦截和处理入站事件,ChannelOutboundHandler拦截和处理出站事件。ChannelHandler和ChannelHandlerContext通过组合或继承的方式关联到一起成对使用。事件通过ChannelHandlerContext主动调用如fireXXX()和write(msg)等方法,将事件传播原创 2021-09-17 20:12:51 · 170 阅读 · 0 评论 -
95-34-035-Context-HeadContext和TailContext
文章目录1. 概述2. 继承体系3.HeadContext3.1 类签名4. TailContext1. 概述 HeadContext和TailContext使用继承的方式关联Handler,作为ChannelPipeline双向链表的头节点和尾节点。2. 继承体系3.HeadContext3.1 类签名final class HeadContext extends AbstractChannelHandlerContext implements ChannelOu原创 2021-09-16 23:04:54 · 295 阅读 · 0 评论 -
95-34-030-Context-DefaultChannelHandlerContext
文章目录1. 概述2. 继承体系3.源码1. 概述2. 继承体系3.源码final class DefaultChannelHandlerContext extends AbstractChannelHandlerContext { private final ChannelHandler handler; DefaultChannelHandlerContext( DefaultChannelPipeline pipeline, EventExecut原创 2021-09-16 23:04:40 · 166 阅读 · 0 评论 -
95-34-025-Context-AbstractChannelHandlerContext
文章目录1. 概述2. 继承体系3.类签名4.关键字段5.构造方法6.ChannelRead事件6.1 findContextInbound7.invokeHandler1. 概述2. 继承体系3.类签名AbstractChannelHandlerContext的类签名如下:abstract class AbstractChannelHandlerContext implements ChannelHandlerContext, ResourceLeakHint { 该类作为其他C原创 2021-09-16 23:03:55 · 157 阅读 · 0 评论 -
95-34-020-Context-ChannelHandlerContext
文章目录1. 概述2. 继承体系1. 概述 每个ChannelHandler被添加到ChannelPipeline后,都会创建一个ChannelHandlerContext并与之创建的ChannelHandler关联绑定。ChannelHandlerContext允许Channelllandler与其他的ChannelHandler实现进行交互。ChannelHandlerContext不会改变添加到其中的ChannelHandler,因此它是安全的。 Context指上下文关系,Chann原创 2021-09-16 21:09:52 · 197 阅读 · 0 评论 -
95-33-020-ChannelHandler-ChannelHandler简介
文章目录1.概述2. 类图2.1 继承逻辑图2.2 方法图1.概述 ChannelHandler并没有方法处理事件,而需要由子类处理:ChannelInboundHandler拦截和处理入站事件,ChannelOutboundHandler拦截和处理出站事件。我们已经明白,ChannelPipeline中的事件不会自动流动,而我们一般需求事件自动流动,Netty提供了两个Adapter:ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapte原创 2021-09-16 21:09:31 · 152 阅读 · 0 评论 -
95-32-015-ChannelPipeline-DefaultChannelPipeline
文章目录1.概述2. 类图2.1 继承结构图2.2 方法图3.字段4.addLast()5.checkMultiplicity()6.filterName6.1 checkDuplicateName6.2 generateNam7.callHandlerCallbackLater8.fireXXX方法和bind等事件触发方法9.invokeHandlerAddedIfNeeded1.概述 DefaultChannelPipeline是ChannelPipeline的一个子类,回忆ChannelHan原创 2021-09-15 22:04:21 · 179 阅读 · 0 评论 -
95-32-010-ChannelPipeline-ChannelPipeline简介
文章目录1.概述1.1 原理图2. 类图2.1 继承结构图2.2 方法图3.ChannelPipeline接口关键方法4.创建pipeline5.一个事件是如何的流经管道呢?6.将事件转发给下一个处理程序7.建立一个pipeline8.线程安全9. 结论:1.概述1.1 原理图 提到pipeline,我们首先想到的是*nix中的管道,可实现将一个程序的输出作为另一个程序的输入。ChannelPipeline也实现类似的功能,不同的是:ChannelPipeline将一个ChannelHandler原创 2021-09-15 22:03:54 · 200 阅读 · 0 评论 -
95-32-010-ChannelPipeline-简介md
文章目录Channel实现概览ChannelPipeline的主流程深入ChannelPipeline内部DefaultChannelPipeline的内部结构sendUpstream和sendDownstream回到现实:Pipeline解决的问题Channel实现概览在Netty里,Channel是通讯的载体,而ChannelHandler负责Channel中的逻辑处理。那么ChannelPipeline是什么呢?我觉得可以理解为ChannelHandler的容器:一个Channel包含一个Ch原创 2021-09-15 22:03:33 · 3159 阅读 · 0 评论 -
95-31-020-ChannelGroup-DefaultChannelGroup
1.拓扑图原创 2021-09-13 21:23:14 · 275 阅读 · 0 评论 -
95-30-020-Channel-NioSocketChannel
文章目录1.概述2. 类图2.1 继承逻辑图2.2 方法图3.doBind方法4. doConnect5.doDisconnect & doClose6.核心方法doReadBytes7.核心方法 doWriteXX8.核心方法:doWrite9.prepareToClose10.netty处理新连接的逻辑2.创建NioSocketChannel1.概述NioSocketChannel作为Channel的最末端子类,实现了NioSocket相关的最底层细节实现。2. 类图2.1 继承逻辑图原创 2021-09-13 21:22:28 · 186 阅读 · 0 评论 -
95-30-018-Channel-AbstractNioByteChannel
文章目录1. 概述2. 类图2.1 继承关系2.2 类图简介3. 构造方法4.read事件框架1. 概述从字面可推知,AbstractNioByteChannel的底层数据为Byte字节。2. 类图2.1 继承关系2.2 类图简介3. 构造方法/** * Create a new instance * * @param parent the parent {@link Channel} by which this instance was created. M原创 2021-09-13 21:22:03 · 212 阅读 · 0 评论 -
95-30-017-Channel-NioServerSocketChannel
文章目录1. 概述2. 类图2.1 继承关系2.2 类图简介3. bind4. doReadMessages5. doClose6. 构造方法1. 概述你肯定已经使用过NioServerSocketChannel,作为处于Channel最底层的子类,NioServerSocketChannel会实现I/O事件框架的底层细节。首先需要注意的是:NioServerSocketChannel只支持bind、read和close操作。2. 类图2.1 继承关系2.2 类图简介3. bind@O原创 2021-09-13 21:21:40 · 192 阅读 · 0 评论 -
95-30-015-Channel-AbstractNioMessageChannel
文章目录1. 概述2. 类图2.1 继承关系2.2 类图简介3. 内部类NioMessageUnsafe3.1 read事件框架1. 概述 AbstractNioMessageChannel是底层数据为消息的NioChannel。在Netty中,服务端Accept的一个Channel被认为是一条消息,UDP数据报也是一条消息。该类主要完善flush事件框架的doWrite细节和实现read事件框架(在内部类NioMessageUnsafe完成)。2. 类图2.1 继承关系2.2 类图简介原创 2021-09-13 21:21:19 · 198 阅读 · 0 评论 -
95-30-012-Channel-AbstractNioChannel
文章目录1. 概述2. 类图3. NioUnsafe4.AbstractNioChannel4.1 Connect事件框架4.2 FinishConnect事件框架4.3 Flush事件细节4.4 构造方法4.5 doRegister4.6 doBeginRead4.7 doClose1. 概述2. 类图3. NioUnsafe Netty的实现中,Unsafe的I/O事件框架中的细节实现方法doXXX()放到了Channel子类中而不是Unsafe子类中,所以我们先分析Unsafe,然后分析原创 2021-09-12 12:22:03 · 904 阅读 · 0 评论