netty权威指南
2019-08-01 13:36:07 2 举报
AI智能生成
netty知识点梳理
作者其他创作
大纲/内容
handler和childHandler
option
serverChannelOption
backlog参数
半链接+全链接队列总和
默认100
一个accpet时从全链接队列获取一个
childChannelOption
SO_TIMEOUT
控制读取操作阻塞多少毫秒,0为无限阻塞
SO_SNDBUF
发送缓冲区大小
SO_RCVBUF
接收缓冲区大小
SO_REUSEADDR
用于决定如何网络上仍有数据向旧ServerSocket传输数据,是否允许新的ServerSocket绑定到相同的端口上
CONNECT_TIMEOUT_MILLIS
客户端连接超时时间
TCP_NODELAY
Bytebuf
原生Bytebuffer缺点
长度固定,容量不能动态扩展收缩,出现数组越界
只有一个位置标识指针,读写转换时要手动调用flip()
api功能有限
Bytebuffer
flip()
flip操作后
flip操作前
典型用法
指针
写入
读取
discardRead
clear
内置方法
readSlice(int length)
返回当前ByteBuf新创建的子区域,与原Bytebuf共享缓冲区,但是独立维护自己的readIndex和writeIndex。新建的子区域readIndex为0,wirteIndex为length
wirteZero(int length)
将当前的缓冲区内容填充为NUL(0x00)起始位置为writeIndex,填充长度为length,填充后wirteIndex+=length
readerIndex和writeIndex
discardable bytes
会造成内存复制,频繁调用会导致性能下降
Clear操作
不清空缓冲区本身,主要是将readIndex和writeIndex还原初始位置
Mard Reset
Derived buffer
duplicate
返回当前byteBuf的复制对象,共享一个缓冲区,但是独立维护读写索引
copy
复制一个新的byteBuf索引和内容都是新的
slice
返回当前byteBuf可读子区域,与原始缓冲区内容共享,读写下标独立维护
set/get随机读写
查找
indexOf
bytesBefore
forEachBytes
HeapByteBuf
基于堆内存分配回收速度快,缺点是需要额外一次内存copy
DirectByteBuf
堆外内存分配,分配回收速度慢,0copy
池化/非池化
池化使用了对象池技术,减少gc,但是会带来额外维护开销
动态扩容
门限4MB,新申请的容量大于4m小于maxCap时以4m的大小增长,小于4m时则以64的倍数进行增长
对象池
PoolArena
由多个chunk组成
chunk
由多个page组成,以二叉树形式存储
page
辅助类
byteBufHolder
bytebuf容器
bytebufAllocator
CompositeBytebuf
将多个bytebuf组装到一起,形成统一视图
BytebufUtil
encodeString
decodeString
hexDump
channel
id生成策略
Mac
进程id
当前系统时间毫秒
当前系统时间纳秒
32位随机整数
32位自增序列
ChannelPipline
过程
事件
ChannelRegistered()
channel注册事件
channelActive
Tcp链路建立成功,channel激活
channelread
channelReadComplete
读完成
exceptionCauth
userEventTriggered
用户自定义
channelWriabilityChanged
写状态变化时
channelInactive
chanelHandler
注解
@Sharable
@Skip
ChannelHandlerAdapter
ByteToMessageDecoder
MessageToMessageDecoder
二次解码器,将一个对象解码成其他对象
lengthFieldBasedFrameDecoder
LengthFiledPrepender
unix五种网络模型
阻塞IO
非阻塞IO
IO多路复用
信号驱动模型
异步IO
tcp粘包
发生原因
write写入字节大于sendBuffer大小
进行MSS大小的Segment分段
以太网帧的payload大于MTU
解决策略
消息定长
消息尾分隔符
分为消息头消息体,头中包含消息长度
LineBasedFrameDecoder
FixedLengthFrameDecoder
DelimiterBasedFrameDecoder
第三方序列化框架的支持
MsgpackDecoder
MsgpackEncoder
ProtobufDecoder
ProtobufEncoder
ProtobufVarint32FrameDecoder(处理半包)
ProtobufVarint32LengthFieldPrepender(处理半包)
http协议支持
HttpRequestDecoder
HttpObjectAggregator(将多个消息转化为单一的FullHttpRequest或FullHttpResponse)
HttpResponseEncoder
ChunkedWriteHandler(支持异步发送较大的码流如大文件传输)
WebSocket协议支持
HttpServerCodeC
WebSocketServerHandshaker
eventLoop
Reactor单线程
nio线程职责
接收客户端连接
向服务端发起连接
读取请求或者应答
发消息或者应答
Reactor多线程
特点
专门的nio线程接收客户端请求(单线程)
读写也有专门的线程池负责
一个NIO线程同时处理n条链路,一个链路对应一个nio线程
主从Reactor多线程
与多线程reactor相比,使用线程池接收客户端请求
最佳实践
不要在channelHandler中启动用户线程
解码要放在NIO线程调用解码Handler中进行,不要切换到用户线程完成
如果业务操作简单,可以直接在NIO线程上完成逻辑
如果业务复杂耗时,可封装成task发到业务线程池中完成
0 条评论
下一页