netty源码 学习

余生颓废 提交于 2020-02-28 10:29:35

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 流程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!