netty 概述


Netty 对于socket 的抽象

NioEventLoop 处理 新连接与 每个连接的数据读写
netty 基本组件
NioEventLoop 即对应 一个 Thread 去不停的 监听 事件
Channel 对应 一个 socket
ByteBuf 对应IO的 Bytes
Pipeline 对应 Loginc Chain 即逻辑链
ChannelHadler 对应 Login 即一个 逻辑处理
Netty 服务端启动
1. 创建服务的channel
2. 初始化服务的channel
3. 注册 selector
4.端口绑定



注册selector

端口绑定

NioEventLoop
1.创建

2. ThreadPerTaskExecutor


3. 创建NioEventLoop 线程

NioEventLoop启动


NioEventLoop执行

检测IO事件


reactor 线程任务执行

新连接接入

连接检测

NioSocketChannel的创建

channel的分类

层级


新连接NioEventLoop分配和selector 注册


NioSocketChannel读事件的注册
pipeline
初始化

添加channelHandler

删除channelHandler

inBound /outBound 事件传播

inBound 更多是 channel 相关事件触发,即被动的, outBound 是事件 主动触发比如读写
异常的传播
1. 异常的触发链和 添加的 childHandler 顺序是有关的, 按照 顺序将异常传递下去。 最终没有异常 处理器的话,
最终会在 尾节点 去 将异常 打印出来。
2. 异常处理的最佳实践: 在 piple 最后添加一个 异常处理器,这样 就可以 进行处理了
内存分配
ByteBuf 结构

discardabl bytes 表示无效的。
readable bytes 可读的
writable bytes 可写的
ByteBuf 分类



Pooled 类即 从 已经分配好的内存去 创建 ByteBuf , 而 Unpooled 直接用jdk 去获取内存 来给byteBuf : 池化非池化
Unsafe 直接可以拿到ByteBuf对象的内存地址,然后就可以直接适用jdk 进行读写操作了。即可以直接从jvm 里面拿到 byteBuf 的内存地址, 可以直接调用jdk 进行读写 。 即直接通过 内存地址了,用到了指针
非Unsafe 即不依赖jdk 底层 unsafe 去调用读写, 而是通过 数组的下标或者Java byteBuf 去取对应的下标,即 适用Unsafe 效率更高
Heap 直接在堆上进行分配,有GC管理
Direct 调用jdk 的API进行内存分配。不受JVM控制,没有GC 。需要手动去释放,否则会内存泄漏
ByteBufAllocator

PooledByteBufAllocator




内存规格介绍

缓存数据结构


命中缓存的分配流程

arena、 chunk 、 page 、 subage 概念

arena 即 开辟一块连续的内存

page 级别内存分配


subpge级别的内存分配




ByteBuf的回收


Netty 解码

抽象解码器ByteToMessageDecoder

行解码器分析

长度域解码器

编码




写buffer 队列


性能优化工具类
fastThreadLocal

对象池Recycler




netty 责任链模式

即 pipeline
netty 调优
单机百万连接


即单机客户端一台电脑 一般最多只能开6W多个客户端,因为只有6W多个端口。
因此 可以 把服务端的端口后 开很多个, 客户端可以任意连某一个端口。就模拟了百万连接


netty 流程

来源:oschina
链接:https://my.oschina.net/ouminzy/blog/3167161