Netty简介
BossGroup和WatchGroup协同工作
Netty是JBoss提供的一个java开源框架
Netty是一个异步的,基于事件驱动的网络应用框架
BIO:每个客户端连接到服务端都会新增一个线程处理,会出现性能问题,会阻塞
NIO
同步非阻塞,服务器实现模式为一个线程处理多个请求
客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有io请求则进行处理
NIO和BIO比较
缓冲区Buffer
flip操作:切换buffer的读写状态,其实是将position重置为0
通道
通道可以同时进行读写,而流只能读或者写
通道可以实现异步读写数据
常用的有:FileChannel(文件读写),DatagramChannel(UDP读写),ServerSocketChannel和SocketChannel
Selector(选择器)
selector能够检测多个注册的通道上是否有事件发生
如果有事件发生,便获取事件然后针对每个事件进行相应的处理
这样可以用一个单线程去管理多个通道,也就是管理多个连接和请求
通过selectkey可以反向获取到channel
selectionKey
零拷贝
常用的零拷贝有mmap和sendFile
传统io的read方法:
1.先使用DMA将数据从硬盘读取到内核中,(DMA拷贝就是不通过cpu的直接内存拷贝)然后用cpu将数据从内核态缓冲区读取到用户态的缓冲区中
2.在用户态缓冲区中对数据进行修改
3.用cpu将用户态缓冲区数据拷贝到socket的缓冲区
4.将socket缓冲区的数据用DMZ拷贝到协议栈
传统io是进行4次拷贝,3次状态切换
优化方法:
mmap:少了一次拷贝
通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据,这样,在进行网络传输时,减少从内核空间到用户空间的拷贝次数
sendFile:
Linux2.1提供了sendFile函数,原理:数据根本不经过用户态,直接从内核缓冲区进入到socketbuffer,同时,由于和用户态完全无关,就减少了一次上下文切换
0拷贝不是不拷贝,而是没有cpu拷贝的意思,从硬盘出来的DMA拷贝是一定要存在的
Linux2.4做了一写修改,避免从内核缓冲区拷贝到socketbuffer操作,直接拷贝到协议栈
又少了一次数据的拷贝
mmap和sendfile的区别:
Netty架构设计
目前存在的线程模型:
1.传统阻塞I/O服务模型
采用阻塞io模式获取输入的数据
每个连接都需要独立的线程完成数据的输入,业务处理,数据返回
2.Reactor模式
Reactor一共有3中实现
Reactor模式,通过一个或多个输入同时传递给服务处理器的模式,基于事件驱动
服务端程序处理传入的多个请求,并将它们同步分派到相应的处理线程
1)单Reactor单线程
2)单Reactor多线程
3)主从Reactor多线程
Netty线程模式是基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor
Netty模型
简单版
复杂版
任务队列taskQueue
异步模型
Netty核心组件
Bootstrap,ServerBootStrap
Future,ChannelFuture
Channel
selector
ChannelHandler
Pipeline和ChannelPipeline
ChannelHandlerContext
Unpooled