netty学习
netty是一个 NIO 框架,它提供了一个高性能、异步事件驱动的网络应用程序框架
NIO
三大主键
channel&buffer 通道/缓冲 ?有哪些
selector 选择器 (适合连接多,流量低)多路复用 单线程配合selector管理多个channel
适合:
多线程设计适合 少连接
线程池适合 短连接( 没有处理完就堵塞)
selector管理多个channel
FileChannel
byteBuffer 指针/limit/容量
byteBuffer默认写模式
flip读模式 clear写 compact压缩指针
粘包:多条数据同时发送 半包 :因为空间限制 只发送了一半
零拷贝 channelTransterTo 不用将数据拷贝到java中 jvm,适合小文件,
遍历 fileWalkfileTree 访问者模式
阻塞
非阻塞 自旋耗cpu
seletor 解决自旋
seletor监听的事件
accept
connect
read
write
netty
组件
eventLoop(事件循环)
单线程执行器 处理channel上的IO事件
eventLoopGroup组 处理IO事件 普通任务 定时任务 默认cpu核心X2
channel通道
pipeline(流水线)添加处理方法 handler
write写入(不是马上刷出 要调用flush)
writeAndFlush写入刷出
ChannelFuture是Netty中的一个接口,它表示一个异步操作的结果。ChannelFuture可以用于监听异步操作的结果,并在结果完成时进行处理。closeFuture关闭
future和promise jdkfuture《nettyfuture《promise
jdkfuture:
get()阻塞等待
nettyfuture:可以同步和异步得到结果
getnow 等待结果非阻塞 没有就null
sync阻塞等待结束 失败抛异常
await 阻塞等待结束 失败不抛异常 要用isSuccess判断是否成功
cause获取失败信息 阻塞
addlinstenee 异步获取结果
promise :两个容器间传递结果
setSuccess设置成功
setfailure 设置失败
channel的handler和pipeline 元素和容器
handler处理入站和出站
byteBuf (netty) 区别红
是基于内存的(默认)读写高,不消耗GC 创建和销毁大 可以切换 堆内存
提供了更多的操作方法,比如读取、写入、复制、转换等
扩容(容量 ,最大容量之间)
池化(默认开启)4.1版本以后
组成 指针(读写),limti ,容量 ,最大容量
写入(各种类型 boolean(01),int (大小),long 等)
对应的读取 读写分离
回收(引用计数(初始1) 调用+1或者-1 等于0就被回收)
头尾释放提高内存使用率
零拷贝
byteBuffer(NIO)
是堆内存的 收到GC影响
读取、写入
组成 指针,limti ,容量
netty零拷贝
byteBuf.slice (大的byteBuf切成小的)切片没有发生复制 原始的不变,不能再写入限制了容量从一个 ByteBuf 复制到另一个 ByteBuf
composite(小的组成大的)切片没有发生复制