【Netty专题】
文章平均质量分 68
netty源码解析
Coinker
世界上只有一种真正的英雄主义,那就是在认清生活真相之后依然热爱生活
——罗曼罗兰
展开
-
【Netty专题】Netty源码剖析_Channel通道
首先我们来思考一个问题,什么是Channel?Channel是Netty抽象出来的对网络I/O进行读/写的相关接口,与NIO中的Channel接口类似。那么Channel有哪些主要功能?网络I/O的读/写客户端发起连接主动关闭连接、关闭链路获取通信双方的地址说明:Netty支持除了TCP以外的多种协议。不同协议、不同阻塞类型的连接会有所不同的Channel类型与之对应。下面我们来看一下常见的几种Channel:1. AbstractChannel首先他有几个主要属性:原创 2021-04-11 15:23:39 · 1721 阅读 · 0 评论 -
【Netty专题】Netty源码剖析_ByteBuf缓冲区
ByteBuf 是Netty的常用组件之一,下面我们来看看他的内部原理究竟是什么样子?ByteBuf的主要特性如下:首先我们思考一个问题,Java JDK自带的NIO Buffer为什么不用呢?有什么优缺点吗?1. 两种缓冲区的对比?NIO ByteBuffer(java.nio.ByteBuffer):只有一个位置指针position,切换读写状态时,需手动调用flip()方式或rewind()方式长度固定,一旦分配完成就不能再扩容和收缩当存入对象大于已有容量时,会引发一场。再来对原创 2021-04-10 21:42:07 · 1431 阅读 · 2 评论 -
【Netty专题】Netty UDP模式 下发指令时收不到上报数据
今天调试项目程序,涉及 6000 台表单线程进行抄读,平均每个表抄读要5秒钟,每天想抄读多次。算下来 6000 * 5 = 30000 s = 500 min ≈ 8.3 hour这样是绝对不行的,于是我想做成多线程抄表,通过netty的 ctx.executor().schedule()方法启动定时任务。可是调试的时候发现下发抄表指令时,上报数据上不来,我和项目经理还有团队大佬研究了半天,还是没有解决。后来经过调试我才发现,是因为我在ctx.executor().schedule()启动定.原创 2021-03-26 14:01:58 · 2350 阅读 · 0 评论 -
【Netty专题】Netty重发机制
背景:最近在项目线上出现一些问题,部分拆包粘包数据并没有拆完,就转发给下一个流程,所以导致数据解析失败。在调试的过程中,我发现了一个Netty神奇的机制——重发机制。介绍:Netty重发:Netty中的byteBuf中的数据如果没有被取走,那么会不停的向下层推送byteBuf中的数据。跟踪源码:1.首先发送一条粘包报文:40 3A 00 29 13 80 94 30 02 7F 01 5A 17 46 02 10 20 10 23 19 00 6C F1 14 38 39 38 36 30 3原创 2020-11-14 17:33:41 · 3840 阅读 · 0 评论 -
【Netty专题】Netty 中channelRead 和 channelRead0 有什么区别?
最近做项目发现Netty中的channel有channelRead 方法也有channelRead0 方法,然后思考下这两个有什么区别呢?我们来直接看源码channelRead@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { boolean release = true; try { if (acce.原创 2021-04-07 09:18:46 · 18512 阅读 · 0 评论 -
【Netty专题】Netty源码剖析_NioEventLoop组件
NioEventLoop组件是Netty的核心组件之一,每个NioEventLoop对象都和Nio的多路复用器Selector一样,要管理成千上万条链路的处理。NioEventLoop的结构图:NioEventLoop有以下5个核心功能:• 开启Selector并初始化。• 把ServerSocketChannel注册到Selector上。• 处理各种I/O事件,如OP_ACCEPT、OP_CONNECT、OP_READ、OP_WRITE事件。• 执行定时调度任务。• 解决JDK空轮询bug原创 2021-04-11 22:39:46 · 1355 阅读 · 0 评论 -
【Netty专题】Netty源码剖析_NioEventLoopGroup组件
用过Netty的都知道,在Netty启动的时候我们需要设置两个线程组,一个叫做Boss,一个叫做Worker,那么两个其实本质都是_NioEventLoopGroup线程组对象。接下来我们来分析下_NioEventLoopGroup都做了哪些事情?创建一定数量的NioEventLoop线程组并初始化创建线程选择器chooser,当获取线程时,通过选择器来获取。创建线程工厂并构建线程执行器。NioEventLoopGroup的结构图:可以看到_NioEventLoopGroup继承Multi原创 2021-04-11 16:01:19 · 1435 阅读 · 0 评论