<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[u012391423的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u012391423</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u012391423]]></copyright><item><title><![CDATA[netty之二次解码MessageToMessageDecoder]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119155698</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119155698</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 23:18:04 +0800</pubDate><description><![CDATA[目录

二次解码

ObjectEncoder 如何实现编码

1、 writeStreamHeader

2、writeClassDescriptor

总结

protobuf的编码解码过程

1、ProtobufVarint32FrameDecoder

2、ProtobufDecoder

3、ProtobufVarint32LengthFieldPrepender

4、ProtobufEncoder

总结



二次解码

我们将数据帧 转为正确的byte数组 我们称之为一次解码

将byte]]></description><category></category></item><item><title><![CDATA[netty之粘包拆包ByteToMessageDecoder]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119155685</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119155685</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 23:16:22 +0800</pubDate><description><![CDATA[目录

拆包粘包

处理的方式

netty的处理方式

netty实现编码解码

1、cumulator.cumulate() 拼接数据包

2、callDecode() 解析数据包

总结

LengthFieldBasedFrameDecoder



拆包粘包



粘包产生的原因：两个包小于缓存区的大小，传送数据会将两个包都放在缓冲区中一起发送，就会产生粘包的问题。 半包产生的原因：当某一个包的大于缓冲区的大小，会被发送多次，每次就收到的就是一个不完整的数据包。



处理的方式







n]]></description><category></category></item><item><title><![CDATA[netty源码之内存池]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119155662</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119155662</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 23:15:09 +0800</pubDate><description><![CDATA[目录

一、DirectBuffer 和 HeapBuffer

对外直接内存缓冲

堆内存缓冲

IO

二、Netty的池化

池化的好处

netty的缓冲池

使用

1、池化Buffer

2、非池化Buffer

三、内存分配

1、PooledDirectByteBuf对象池的使用

2、回收池Recycler原理

3、堆外内存的分配

四、apache的对象池

commons-pool



一、DirectBuffer 和 HeapBuffer



对外直接内存缓冲



direc]]></description><category></category></item><item><title><![CDATA[netty源码之写数据]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119153117</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119153117</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 20:52:39 +0800</pubDate><description><![CDATA[目录

前言

和快递比较一下

几种场景

发送数据的分类

写数据

flush数据





前言

write 是把数据写到buf里

flush 是将数据发出去

writeAndFlush 写入数据到buf 并立刻发送出去

和快递比较一下







几种场景

1、netty协数据，写不进去了 ， 会停止写 ， 然后注册一个OP_WRITE事件 ， 来通知什么时候可以写进去了再写

2、netty批量写数据时，如果想写的都写完了， 接下来会尝试写更多 ， 调整maxBytesPerG...]]></description><category></category></item><item><title><![CDATA[netty源码之业务逻辑处理]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119153086</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119153086</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 20:50:33 +0800</pubDate><description><![CDATA[目录

前言

流程

1、业务逻辑的入口，read

2、从pipeline的链表上依次执行







前言







红色的部分就是我们这次分析的核心







pipeline ， 本质上是一个双向的链接，请注意是双向 ， 它有head、tail , 中间有很多Context , 每个context 包含了需要执行的handler ,我们可以正向或者反向的查找下一个要执行的handler。







流程

1、业务逻辑的入口，read

业务逻辑的切入点，可以很明确的确认是在读数据.]]></description><category></category></item><item><title><![CDATA[netty源码之读取数据]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119153027</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119153027</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 20:48:41 +0800</pubDate><description><![CDATA[目录



前话

1、读数据的技巧

2、简约流程

3、读数据的本质

流程

1、读取数据



前话

1、读数据的技巧







2、简约流程







3、读数据的本质









流程



读数据的轮询和接收连接是一样的 ，都是在NioEventLoop对象的run方法里，但是在最终读的时候，调用了另外一个对象，AbstractNioByteChannel.read 方法

1、读取数据


//AbstractNioByteChannel 
public fina...]]></description><category></category></item><item><title><![CDATA[netty源码之接收连接]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119152991</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119152991</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 20:45:56 +0800</pubDate><description><![CDATA[目录

接收链接

netty的接收连接

前话

1、bossGroup 轮询链接事件

2、bossGroup 创建socketChannel

3、ServerBootstrapAcceptor注册到worker线程

4、workerGroup 将 socketChannel 注册到选择的NioEventLoop的selector

5、workerGroup 注册读事件



接收链接



NIO的读事件


 while(!stop){//循环遍历selector,休眠时间为1S,当又处于就绪]]></description><category></category></item><item><title><![CDATA[netty之心跳机制]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119152914</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119152914</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 20:41:09 +0800</pubDate><description><![CDATA[目录

一、前言

二、netty的心跳工具

三、IdleStatehandler

1、构造方法

2、handlerAdded

3、定时任务

4、读事件空闲

5、写事件空闲



一、前言

心跳机制就是定时的给对端发送特殊的数据包 ， 对端收到后回复特殊的数据包 ， 这一次往返的ping-pong过程 ， 就是一次心跳，心跳的目的是为了让双方感知 ，对方还活着。

TCP协议层也是有心跳机制的 ， 但是他的心跳是2个小时 ，且依赖底层操作系统 ，整体来讲不是很灵活 ， 所以一般都是在应用层自由]]></description><category></category></item><item><title><![CDATA[netty源码之NioEventLoop]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119152875</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119152875</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 20:39:44 +0800</pubDate><description><![CDATA[目录

一、初始化

1、NioEventLoopGroup最终都是调用父类MultithreadEventLoopGroup的构造器

2、通过父类MultiThreadEventExecutorGroup构造器创建NioEventLoopGroup实例，内部维护了一个SingleThreadEventExecutor类型的数组，通过newChild()方法进行实例化

3、newChild()方法实例化的是NioEventLoop类型的EventLoop对象

4、NioEventLoop 打开一个se]]></description><category></category></item><item><title><![CDATA[netty源码之启动流程]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119121496</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119121496</guid><author>u012391423</author><pubDate>Tue, 27 Jul 2021 00:08:09 +0800</pubDate><description><![CDATA[一、前言









our thread 就是我们的主线程， boss thread 就是netty的 bossGroup线程 ， 也就是reactor的主线程



二、启动

启动的本质

启动的实质是什么？实际上我们只需要找到java nio 的那些代码就可以了

1、打开一个selector

2、打开一个channel

3、绑定一个端口

4、将channel 注册到selector 并标明感兴趣的事件



netty启动三部曲

1、实例化引导程序 ServerBootstrap
.]]></description><category></category></item><item><title><![CDATA[netty之channelPipeline]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119117936</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119117936</guid><author>u012391423</author><pubDate>Mon, 26 Jul 2021 20:39:15 +0800</pubDate><description><![CDATA[目录

一、channelPipeline

二、执行流程

三、筛选



一、channelPipeline

BIO中是面向字节流或者字符流来进行传输的。

NIO中是基于块的传输，而且是面向channel的。

netty是面向管道的 ， 这个管道就是包装之后的nio channel 。一个channel 包含了一个channelPipeline管道对象，pipeline中又维护了一系列handlerContext组成的双向链表，这个链表的头是headContext , 尾部是tailContext]]></description><category></category></item><item><title><![CDATA[netty之linux零拷贝]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119117600</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119117600</guid><author>u012391423</author><pubDate>Mon, 26 Jul 2021 20:19:35 +0800</pubDate><description><![CDATA[一、DMA拷贝

Direct Memory Access , 直接内存访问，是一种无须cpu的参与就可以让外设与系统内存进行双向数据传输的硬件机制。

DMA拷贝使系统CPU从实际的IO数据传输中解脱出来，从而大大提高系统吞吐率。在数据传输期间，cpu可以并发的执行其他任务。





二、传统IO数据copy



传统的IO数据拷贝需要经历4次copy 和 3次状态切换

四次copy:

1、由硬件 经过DMA ——&gt; 内核buffer

2、内核buffer ——&gt; 用户buffe..]]></description><category></category></item><item><title><![CDATA[netty知识总结]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119117457</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119117457</guid><author>u012391423</author><pubDate>Mon, 26 Jul 2021 20:13:27 +0800</pubDate><description><![CDATA[目录







一、tcp &amp; udp

二、tcp如何保证更可靠

1、确认应答和序列号

2、超时重传

3、流量控制

4、拥塞控制

三、滑动窗口

四、状态流转

五、粘包、拆包

MTU（Maximun Transmission Unit)

MSS（Maximun Segment Size）

1、引起拆包、粘包的原因

2、tcp解决方案

3、netty解决方案

六、同步、异步、阻塞、非阻塞

七、网络IO模型

八、BIO、NIO、AIO

九、select 、poll 、]]></description><category></category></item><item><title><![CDATA[netty源码之关闭服务]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119117434</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119117434</guid><author>u012391423</author><pubDate>Mon, 26 Jul 2021 20:10:49 +0800</pubDate><description><![CDATA[目录

一、前言

二、客户端的关闭服务

1、进入workerGroup.shutdownGracefully()

2、NioEventLoop.run() 关闭的入口

3、closeAll()

4、confirmShutdown()方法

5、cleanup() 关闭selector



一、前言



这里的关闭包含了boss/worker两个线程，是netty提供的优雅退出。





二、客户端的关闭服务







1、进入workerGroup.shutdownGracefull..]]></description><category></category></item><item><title><![CDATA[netty源码之断开连接]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119117406</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119117406</guid><author>u012391423</author><pubDate>Mon, 26 Jul 2021 20:09:48 +0800</pubDate><description><![CDATA[目录

一、前言

二、正常关闭

1、关闭前的处理工作

2、doClose0调用jdk的close 关闭channel

3、fireChannelInactiveAndDeregister 传播关闭、解绑定事件

4、doDeregister取消selector上的selectorKey

三、异常关闭

四、总结





一、前言

关闭的逻辑是在read方法里 ， 当接受的数据&lt;0时，说明没有可接受的数据了，可以关闭了。





二、正常关闭





1.allocHandle.las]]></description><category></category></item><item><title><![CDATA[netty之io模型]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/119117309</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/119117309</guid><author>u012391423</author><pubDate>Mon, 26 Jul 2021 20:07:55 +0800</pubDate><description><![CDATA[前言

所有的IO的前戏都是这三部曲

1、new socket()

2、bind 端口

3、监听 端口

一、BIO






package netty.bio;
​
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
​
/**
 * @a.]]></description><category></category></item><item><title><![CDATA[netty - 线程模型 reactor]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/118914043</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/118914043</guid><author>u012391423</author><pubDate>Mon, 19 Jul 2021 20:57:14 +0800</pubDate><description><![CDATA[目录



线程模型

1、传统IO服务模型

2、Reactor模式

reactor

三种模式：

总结

netty模型

执行流程简述



线程模型

1、传统IO服务模型

阻塞的IO模式获取输入数据，每个链接需要独立的线程完成数据传输及处理

当并发数较大时，创建大量线程，占用系统资源；线程创建后如无数据读写，将被阻塞







2、Reactor模式

reactor

针对传统的IO模型的两个缺点，解决方案：

a、基于IO多路复用模型：多个连接共用一个阻塞对象。应用程序只需要在一.]]></description><category></category></item><item><title><![CDATA[mybatis 总结]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/118642519</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/118642519</guid><author>u012391423</author><pubDate>Sat, 10 Jul 2021 23:13:28 +0800</pubDate><description><![CDATA[目录

一、jdbc的几个步骤

二、什么是mybatis

三、什么是ORM

四、mybatis优缺点

五、mybatis的分页

六、分页插件的基本原理

七、插件的原理

八、如何编写一个插件

九、动态sql

十、xml映射文件中有哪些标签

十一、mybatis是否支持延迟加载

十二、mapper.xml对应的dao接口原理

十三、#{} 和 ${} 区别

十四、.Mybatis执行批量插入，能返回数据库主键列表吗

十五、不同xml文件 ， id是否可以重复

十六、Mybati..]]></description><category></category></item><item><title><![CDATA[mybatis 之 设计模式]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/118642478</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/118642478</guid><author>u012391423</author><pubDate>Sat, 10 Jul 2021 23:12:38 +0800</pubDate><description><![CDATA[目录





一、建造者模式

二、工厂模式

三、单例模式

四、代理模式

五、适配器模式

六、模板方法

七、装饰器模式

八、责任链模式



一、建造者模式

建造者模式（builder Pattern） ： 使用多个简单的对象一步一步构建成一个复杂的对象。

mybatis中以Buidler结尾的对象基本上都是建造者模式。比如 SqlSessionFactoryBuilder,用以构建SqlSessionFactory对象。

mybatis中有一个很完整的构造者模式：





二、工厂模]]></description><category></category></item><item><title><![CDATA[mybatis 之 插件]]></title><link>https://blog.youkuaiyun.com/u012391423/article/details/118580615</link><guid>https://blog.youkuaiyun.com/u012391423/article/details/118580615</guid><author>u012391423</author><pubDate>Thu, 08 Jul 2021 19:29:21 +0800</pubDate><description><![CDATA[目录

一、自定义插件

二、扫描

三、封装

四、执行

五、应用



一、自定义插件

mybatis的插件是代理模式 与 责任链模式的结合。 每一个插件以责任链并进行封装，都是一层对Executor的代理


@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class , RowBounds.class , ResultHandler.cla]]></description><category></category></item></channel></rss>