Netty源码解析
文章平均质量分 84
Netty源码解析
恐龙弟旺仔
保持热爱,保持进步
展开
-
Netty实战之Sentinel框架应用(二)
前言:上文中了解完Sentinel中NettyClient的创建之后,本文就来学习下NettyServer是如何创建的。相对NettyClient而言,server相对容易些。1.定义服务端接口同样的,面向接口编程。服务端也是首先创建一个接口,如下所示:public interface ClusterTokenServer { /** * Start the Sentinel cluster server. * * @throws Excep原创 2021-12-30 19:57:57 · 754 阅读 · 0 评论 -
Netty实战之Sentinel框架应用(一)
前言:在学习完了Netty的基本知识后,我们来实战下。笔者之前有使用过Sentinel的相关技术,其中client与server端的交互就是使用Netty来完成的。那本文我们就来分析下NettyClient的使用。笔者分析的Sentinel源码版本为1.7.01.定义客户端交互接口面向接口编程,而不是面向类编程。作为一个框架设计者,需要时刻谨记该原则。Sentinel也是,在创建客户端连接时,首先提出一个接口。public interface ClusterTran原创 2021-12-30 19:54:38 · 845 阅读 · 0 评论 -
Netty源码解析-ReadTimeoutHandler、WriteTimeoutHandler
前言:上一篇博客中介绍了IdleStateHandler的使用场景及源码分析,我们可以使用IdleStateHandler来进行心跳检测。除了这个,还有两个Handler与该IdleStateHandler功能类似,是作为其的补充。本文就来介绍下。1.ReadTimeoutHandler/** * Raises a {@link ReadTimeoutException} when no data was read within a certain * period of time原创 2021-12-30 19:49:50 · 2308 阅读 · 0 评论 -
Netty源码解析-IdleStateHandler
前言:心跳机制广泛运用在我们的应用平台中。对于连接到应用服务的客户端,服务端有必要对长时间没有请求的客户端连接进行清理,以避免连接过多。这就需要服务端有空闲连接检测机制。而针对客户端而言,如果长时间未请求数据,为避免被服务端清理连接,就需要间歇性的发送心跳请求。在Netty中,针对以上需求,已经有现成的Handler可供使用,这就是本文要介绍的IdleStateHandler。1.IdleStateHandler的使用1.1 服务端检测长时间未请求的客户端我们在服务端可以使用Id原创 2021-12-30 19:45:48 · 2127 阅读 · 0 评论 -
Netty源码解析-LoggingHandler
前言:在最开始我们创建HelloServer的示例中,我们为ServerBootStrap指定了LoggingHandler,当时的代码是这样写的ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup) // 指定处理channel .channel(NioServerSocketChannel.class) // 设置属性值 .option(ChannelOption.SO原创 2021-12-30 19:41:12 · 1884 阅读 · 0 评论 -
Netty源码解析-Netty解决Nio epoll bug
前言:Netty作为一个优秀的NIO框架,不仅仅是对JDK NIO的使用进行封装,使其更易用,而且对其一些原生BUG也进行了修复。其中epoll cpu 100%的一个bug的修复更是经典。1.bug产生的场景常规使用NIO ServerSocket来接收连接的方式如下:Selector selector = Selector.open();while (true) { int count = selector.select(); Set<SelectionKe原创 2021-12-30 19:38:01 · 1438 阅读 · 0 评论 -
Netty源码解析-共享Channel的使用
前言:之前分析使用ChannelHandler的文章中,每次我们在ChannelPipeline中添加上新new出来的ChannelHandler即可。在ChannelPipeline.addFirst()或其他相关添加方法中,我们可以看到以下代码public class DefaultChannelPipeline implements ChannelPipeline { @Override public final ChannelPipeline addFirst(EventE原创 2021-12-28 19:53:21 · 1416 阅读 · 0 评论 -
Netty源码解析-Future与Promise
前言: 所谓异步编程,那我们首先要明白什么是同步编程? 我们常见的编程手段基本都是基于同步策略,client发起一次方法调用,server(也可以是与client处于同一JVM的一个方法)处理请求,处理完成后返回响应给client。client在接收到响应之前处于阻塞状态。整个过程有点像之前 IO简述时,针对BIO、NIO和AIO的分析过程。当然这是基于操作系统层面的,我们今天分析的主要是基于应用层面的。 同步编程示例图如下: 异步编程时,client在发起...原创 2021-12-28 19:50:43 · 639 阅读 · 0 评论 -
Netty源码解析-ChannelOutboundBuffer详解
前言: 在上篇文章介绍了NioSocketChannel的写操作之后,我们知道其真正动作可以分为两步:分别是write和flush。write操作将msg信息放入ChannelOutboundBuffer容器之后就结束了,而flush操作才真正将存在在容器中的数据发送到对端。 本文就来介绍下ChannelOutboundBuffer容器的基本结构。1.ChannelOutboundBuffer基本属性// an internal data structure used by...原创 2021-12-28 19:41:52 · 961 阅读 · 0 评论 -
Netty源码解析-NioSocketChannel之write
前言: 前一篇中介绍了NioSocketChannel连接远程Server(connect),并接收信息(read)事件的处理过程。 那么NioSocketChannel的主要功能中,还剩下写出(write)事件的处理了。我们一起来了解下该功能的实现。1.write方法的分类 write方法的入口在哪里呢?我们在之前Bootstrap的示例中有以下代码Channel ch = b.connect(HOST, PORT).sync().channel();// 控...原创 2021-12-28 18:25:37 · 1228 阅读 · 1 评论 -
Netty源码解析-NioSocketChannel之connect、read
前言: 前一篇中我们介绍了NioServerSocketChannel,NioServerSocketChannel主要负责两件事:绑定(bind)到本地port,作为一个Endpoint;监听客户端连接事件,将获取到的连接注册到EventLoop中。 那么数据的读写呢?NioServerSocketChannel不负责数据的读写,那么数据读写都交由NioSocketChannel来负责。 本文主要讲解NioSocketChannel 处理连接(connect)、读(read)...原创 2021-12-27 19:14:57 · 1138 阅读 · 0 评论 -
Netty源码解析-NioServerSocketChannel
前言:通过之前那么多的分拆知识点讲解,终于到了最重要的阶段了。无论之前的EventLoop还是ByteBufAllocate,终归都是为Channel服务的。Channel的实现类才是最终连接、读写事件的执行者。本文主要聚焦于NioServerSocketChannel,作为Server端,主要用于接收客户端连接,并为该连接注册事件,我们通过源码的角度来分析下连接的整个过程。1.NioServerSocketChannel构造图分析类的时候,尤其Netty框架这种结构层特别多的关键类时,要学原创 2021-12-27 19:07:34 · 883 阅读 · 0 评论 -
Netty源码解析-Channel生命周期与ChannelHandler处理方法
前言:在之前的文章中,我们已经熟练的使用了ChannelHandler来处理各种请求。同时也了解了各Channel的不同,后续会继续详细介绍SocketChannel和ServerSocketChannel等相关知识点。在本文中我们来了解下Channel的生命周期(也就是一个客户端连接SocketChannel从连接完成到最后关闭经历过哪些阶段),和其触发的ChannelHandler的那些方法,以期对这两者之间有更好的理解。1.示例准备示例的话,我们还是使用之前的示例,在这里主要展示S原创 2021-12-27 19:01:38 · 1457 阅读 · 0 评论 -
Netty源码解析-Netty之Channel初探
前言: 了解完前面的知识块,也就是最开始的文章中说的 * EventLoop和EventLoopGroup * ChannelHandler与ChannelPipeline * ByteBuf与ByteBufAllocator 这些大块以后,我们可以看下最核心的模块:Channel。基本所有重要的工作,注册、获取连接、读写都是Channel在执行。 本文主要对Channel接口的基本功能进行介绍,对其相关实现类进行简单介绍。后面会专门提供两篇文...原创 2021-12-27 18:58:14 · 560 阅读 · 0 评论 -
Netty源码解析-Netty内存泄露检测
前言:在前一篇文章中,我们介绍了ByteBuf的引用计数器的使用,基本所有的ByteBuf都有相关计数的功能,那么这个计数有什么用呢。实际主要就是做内存泄露检测用的。本文就其如何做检测来进行说明。1.ByteBuf为什么会内存泄露?在使用ByteBuf的时候,我们一般会使用Allocator来进行分配创建,如下所示:// 创建一个非池化的HeapBufferByteBuf heapBuffer = UnpooledByteBufAllocator.DEFAULT.heapBuf原创 2021-12-23 19:15:14 · 1750 阅读 · 0 评论 -
Netty源码解析-ByteBuf的引用计数
前言: 之前介绍ByteBuf基本API及相关实现类时,不知道大家有没有注意到,ByteBuf抽象类实现了ReferenceCounted接口。这个接口是做什么的呢?主要是做计数用的。为什么需要计数呢?我们暂且不表,先分析下这个接口的若干方法如何实现计数功能,最后再说明下计数使用的场景。1.ReferenceCounted接口的基本方法public interface ReferenceCounted { /** * Returns the reference ..原创 2021-12-23 19:08:12 · 984 阅读 · 0 评论 -
Netty源码解析-ByteBuf基本API
前言: Netty提供了自己的ByteBuffer操作类,名字叫做ByteBuf。相比较而言,ByteBuf的操作相对简单些,也提供了更多的方法来操作字节数组。1.ByteBuf的基本参数 ByteBuf是一个基本接口,只提供方法,关于其基本参数我们可以参考其最重要的抽象实现类AbstractByteBufpublic abstract class AbstractByteBuf extends ByteBuf { // 读索引(该值之前的数据都是已读过的,可读值范...原创 2021-12-23 19:03:17 · 1124 阅读 · 0 评论 -
Netty源码解析- 粘包拆包的原理及处理方案
前言: 前一篇中我们主要讲解了ChannelHandler的几个抽象实现类,大致了解了下各个抽象实现类在不同场景中的运用。 本文就要一起来看下另一个比较好玩的问题,也是一个比较难点的问题,就是Netty如何解决TCP字节流的粘包、拆包问题。1.什么是粘包、拆包? 如果不涉及底层处理的话,我们很少会重视这个问题。TCP难道不是直接将消息发送到对端嘛?为什么会有粘包、拆包的问题呢? 先用几个图来展示下正常发包和粘包、拆包下的不同之处。 正常包传递:...原创 2021-12-23 12:36:31 · 1108 阅读 · 0 评论 -
Netty源码解析- ChannelHandler相关实现类
前言: ChannelHandler我们之前有介绍过其接口作用,inbound和outbound事件的真正处理着就是ChannelHandler相关实现类。 当我们使用Netty进行业务开发时,可以通过对ChannelHandler的实现类来进行业务处理。 当然,我们还有其他更好的选择,Netty为我们提供了一些关于Netty的抽象类和实现类,我们可以选择直接继承。下面我们就来了解下ChannelHandler的相关实现类(抽象类)。1.ChannelHandler部分...原创 2021-12-21 20:28:27 · 950 阅读 · 0 评论 -
Netty源码解析- ChannelPipeline对异常事件的处理
前言:之前我们分析了inbound outbound事件在ChannelPipeline中的流转过程,确定了inbound事件在ChannelHandler中的处理顺序为head -- > tail,而outbound事件在ChannelHandler中的处理顺序为tail --> head。以上都是正常的流程,如果当ChannelHandler处理请求出现问题时,关于异常是如何在ChannelPipeline中流转的呢?本文就此问题来进行探讨。1.AbstractChannel原创 2021-12-21 12:23:33 · 2913 阅读 · 0 评论 -
Netty源码解析-ChannelPipeline inbound、outbound事件的传播
前言: 接上一篇文章,我们介绍了ChannelPipeline、ChannelHandlerContext、ChannelHandler之间的关联关系。通过类比LinkedList的方式,我们可以将ChannelHandlerContext当做集合中的每一个Node,Node有prev和next属性,指向前和后一个节点;而ChannelPipeline就是集合本身,提供对ChannelHandlerContext的操作。1.ChannelPipeline中的节点操作相关方法// 添加..原创 2021-12-20 19:39:00 · 625 阅读 · 0 评论 -
Netty源码解析-ChannelPipeline与ChannelHandler初探
前言: 前文中的EventLoop分析中,我们知道了每个EventLoop都有一个对应的Selector,用于关注注册在其上的Channel的各种读写事件。 当发生读写事件时,会交由Unsafe(本质上也是Channel的包装类)来处理,比如读事件// 1.在NioEventLoop.run中,接收到读事件,直接调用unsafe来处理,如下2方法所示unsafe.read();// 2.AbstractNioByteChannel.read@Overridepublic ...原创 2021-12-20 12:31:30 · 460 阅读 · 0 评论 -
Netty源码解析-EventLoop线程状态变化
前言: 通过前面对EventLoop的学习,我们知道,一个EventLoop实例代表了一个Selector注册器,所有的事件都注册到这个Selector上。而所有的事件监听和执行呢,也都是在这个EventLoop上,前面的run()方法分析中已经说明过。 而NioEventLoop的父类SingleThreadEventLoop和SingleThreadEventExecutor则代表了一个任务执行器,其创建了唯一的线程用来执行被触发的事件。本文就来介绍下这个任务执行器及其线程状态的执行...原创 2021-12-16 12:35:55 · 1775 阅读 · 0 评论 -
Netty源码解析-EventLoop任务的注册与执行
前言: 根据前一篇中EventLoopGroup和EventLoop的分析介绍,我们大致了解了两者之间的关系。EventLoopGroup本质上就是一组EventLoop的集合,本身并不执行registe、run等方法,而是根据Chooser选择一个EventLoop来执行。 所以,本文我们就聚焦EventLoop的关键方法,看其如何执行这些关键方法。 同样,我们只关注实现类NioEventLoop。1.NioEventLoop的创建 在之前的代码示例中,没有...原创 2021-12-15 20:40:04 · 729 阅读 · 0 评论 -
Netty源码解析-EventLoop与EventLoopGroup初探
前言: 在之前的ServerBootstrap示例中,有两句代码比较独特NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);NioEventLoopGroup workerGroup = new NioEventLoopGroup(DEFAULT_EVENT_LOOP_THREADS);通过其实现接口EventLoopGroup的注解我们了解到,/** * Special {@link EventExec...原创 2021-12-14 19:18:39 · 613 阅读 · 0 评论 -
Netty源码解析-ServerBootstrap与BootStrap初探
前言: 在之前系列的介绍了NIO相关的文章之后,我们可以在此基础上进行Netty的学习了。建议不太了解NIO的同学,可以先看下相关系列文章。Netty的本质还是NIO。 Netty笔者之前也有学习过,主要是跟着<<Netty in action>>这本书进行学习的,所以主要还是使用方面的,当然,学习完成之后,也从来没有使用到过,所以到目前为止也忘记的七七八八了。 记得有一次面试,面试官问我,你觉得Netty哪里好,支支吾吾的说了半天,就是觉得架构好,...原创 2021-12-13 20:34:58 · 1339 阅读 · 0 评论