电子商务网站推广策划方案,云主机 怎么做网站,网站建设费可以走办公费吗,常州网站排名优化Java I/O模型发展以及Netty网络模型的设计思想 I/O模型Java BIOJava NIOJava AIO NIO Reactor网络模型单Reactor单线程模型单Reactor多线程模型主从Reactor多线程模型 Netty通信框架 前言#xff1a; BIO、NIO的代码实践参考#xff1a;Java分别用BIO、NIO实现简单的客户端服… Java I/O模型发展以及Netty网络模型的设计思想 I/O模型Java BIOJava NIOJava AIO NIO Reactor网络模型单Reactor单线程模型单Reactor多线程模型主从Reactor多线程模型 Netty通信框架 前言 BIO、NIO的代码实践参考Java分别用BIO、NIO实现简单的客户端服务器通信
I/O模型
I/OI和O指input和output输入输出通俗理解用怎么样的通道进行数据的发送和接收很大程度上决定程序通信的性能
Java共支持三种I/O模型BIONIOAIO
BIO同步阻塞一个线程处理一个连接。只要有一个客户端连接到服务器就需要开一个线程。同一个线程的连接和读写操作会阻塞NIO同步非阻塞一个线程处理多个连接。实现方式是客户端的请求事件都会注册到多路复用器selector上面多路复用器进行轮询处理AIO异步非阻塞引入异步通道概念采用Proactor模式有效请求事件才会启动线程特点是先由操作系统完成后才通知服务器程序启动线程适用于连接数多的长连接请求
Java BIO
流程
服务器启动一个ServerSocket客户端启动socket与服务器通信。服务器需要对每个客户端建立一个线程客户端发出请求后先咨询服务器有无线程响应没有则等待有响应客户端会等待请求结束后再继续执行 Java NIO
主要概念
三大核心Channel通道Buffer缓冲区Selector多路复用器非阻塞模式一个线程从通道请求或读取数据时它仅能得到能用的数据无可用数据时不会阻塞线程可以继续做其他事情非阻塞写也是一样不需要等待写入通俗理解NIO可以做到用一个线程处理多个操作假设有10000个请求实际可能只需要开50-100个线程不像BIO一样必须分配10000个线程HTTP2.0也使用了多路复用技术做到了一个连接并发处理多个请求数量比HTTP1.0大了好几个数量级 Channel通道Buffer缓冲区Selector多路复用器的关系 每个Channel对应一个BufferSelector对应一个线程一个线程对应多个ChannelSelector根据不用事件在各个通道上切换Buffer是一个内存块底层是数组读写切换需要用flip()Channel是双向的可以返回底层操作系统的情况 Channel BIO的stream是单向的Channel是双向的可以读也可以写常见的Channel还有FileChannelDatagramChannelSocketChannelServerSocketChannelFileChannel文件读写DatagramChannelUDP读写SocketChannelServerSocketChannelTCP读写 NIO编程流程
服务器启动一个ServerSocket得到一个ServerSocketChannel创建一个服务器的SelectorServerSocketChannel注册到Selector上标记为连接事件Selector监听该事件开始循环Selector得到有事件的SelectorKey集合并进行轮询使用SelectorKey上绑定的Channel进行业务处理连接读写 Java AIO
NIO Reactor网络模型
单Reactor单线程模型
方案
Selector是网络编程API可以实现应用程序对多路链接请求的处理服务器用一个多路复用器即一个Reactor监听所有的客户端的请求连接、读、写事件每次处理完连接会创建一个Handler处理连接后的读写业务处理Handler负责完成整个读、业务处理、写业务流程
优缺点
代码简单只有一个线程清晰明了客户端连接较多时无法支撑一般的NIO实现样例就是用的这种模型Java分别用BIO、NIO实现简单的客户端服务器通信 单Reactor多线程模型
方案
Selector是网络编程API可以实现应用程序对多路链接请求的处理服务器用一个多路复用器即一个Reactor监听所有的客户端的请求连接、读、写事件每次处理完连接会创建一个Handler处理连接后的读写业务处理Handler只响应事件读取数据不做业务处理分发给worker线程池里面的线程处理业务worker线程池分配一个线程负责完成业务处理、回传等业务流程
优缺点
可以充分利用多核cpu处理能力多线程数据访问和共享比较复杂Reactor同样是单线程相比于单Reactor单线程模型性能好一些但是高并发场景同样会遇到性能瓶颈 主从Reactor多线程模型
方案
Reactor主线程和Reactor从线程主线程负责处理连接事件从线程负责处理读写事件主Reactor通过Acceptor处理完连接事件后主Reactor把连接分给从Reactor处理从Reactor将连接的channel注册到Selector中进行监听并创建各种Handler进行处理Handler只响应事件读取数据不做业务处理分发给worker线程池里面的线程处理业务worker线程池分配一个线程负责完成业务处理、回传等业务流程
优缺点
主线程和从线程数据交互简单职责明确能处理较大并发量编程复杂度较高 Netty通信框架
主要基于主从Reactor多线程模型做了一定的改进增加了Reactor线程池可以多个主线程和多个从线程并发处理
Netty模型图简单版 Netty模型图复杂版
工作原理
netty抽象出两种线程池BossGroupWorkGroup分别做连接事件多路复用和网络读写事件多路复用BossGroupWorkGroup都是NioEventLoopGroupNioEventLoopGroup相当于事件循环组组中有多个NioEventLoop事件循环NioEventLoop表示一个不断循环的执行处理任务的线程每个NioEventLoop都有一个多路复用器Selector每个BossGroup中的NioEventLoop执行步骤是 a. 轮询accept事件 b. 处理accept事件与客户端建立连接生成channel并将其注册到某个WorkGroup中的NioEventLoop上的Selector c. 处理任务队列的任务即runAllTask每个WorkGroup中的NioEventLoop执行步骤是 a. 轮询read,write事件 b. 处理read,write事件主要是处理channel c. 处理任务队列的任务即runAllTask每个WorkGroup中的NioEventLoop处理业务时会使用pipeline管道pipeline包含了channelpipeline维护了很多handler处理器