Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
Netty是一个NIO客户端服务器框架,它支持快速、简单地开发协议服务器和客户端等网络应用程序。它大大简化了网络编程,如TCP和UDP套接字服务器。
“快速而简单”并不意味着最终的应用程序将遭遇可维护性或性能问题。Netty经过精心设计,积累了许多协议(如FTP、SMTP、HTTP和各种二进制和基于文本的遗留协议)实现的经验。因此,Netty成功地找到了一种方法,可以在不妥协的情况下实现开发、性能、稳定性和灵活性

BIO NIO AIO

  • BIO
    BIO适用于连接数比较小的应用,这种IO模型对服务器资源要求比较高。
  • NIO
    NIO适用于连接数目多、连接时间短的应用,比如聊天、弹幕、服务器间通讯等应用。
  • AIO
    AIO适用于连接数目多、连接时间长的应用,比如相册服务器。

1.BIO

同步并阻塞模型,服务器会为每一个连接建立一个线程,如果连接过多,且线程不做任何事情,会极大的浪费资源,示意图如下:
Netty(1)

机制

Netty(1)

流程

  • 服务器端启动ServerSocket。
  • 客户端启动Socket对服务器进行通信,服务器会为每个客户端建立一个线程与之通信。
  • 客户端发送请求,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝。
  • 如果有响应,客户端线程会等待请求结束后,再继续执行。
    问题

存在问题

  • 服务端对于每个请求都要建立独立的线程。
  • 并发数大时,要创建大量的线程,系统资源占用大。
  • 连接建立之后,如果当前线程暂时没有数据可读,则线程就阻塞再Read上,造成线程资源浪费。

2. NIO

  • 同步非阻塞模型,服务器端用一个线程处理多个连接,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理:
    Netty(1)
    NIO的非阻塞模式,使得一个线程从某通道发送请求或者读取数据时,如果目前没有可用的数据,不会使线程阻塞,在数据可读之前,该线程可以做其他的事情。

NIO三大核心部分:

  • Channel(通道)
  • Buffer(缓冲区)
  • Selector(选择器)
    Netty(1)
    由图可知:
  • 每个Channel对应一个Buffer。
  • Selector对应一个线程,一个线程对应多个Channel。
  • Selector会根据不同的事件,在各个通道上切换。
  • Buffer是内存块,底层是数据。

1.缓冲区

本质是可以读写数据的内存块,Channel读取或者写入的数据必须通过Buffer:
Netty(1)

2.通道(Channel)

通道是双向的,可以读操作、也可以写操作。
Netty(1)

  • FileChannel用于文件的数据读写,
  • DatagramChannel用于UDP的数据读写
  • ServerSocketChannel和SocketChannel用于TCP的数据读

3.Selector

Selector选择器使用一个线程来维护。多个Channel会以事件的方式注册到同一个Selector,当有事件发生时,Selector会获取事件,然后针对每个事件进行响应的处理。这样就不必为每个连接创建一个线程,不用维护多线程,也不会有多线程之间的上下文切换导致的系统的开销。
Netty(1)

3.AIO

异步非阻塞模型,AIO引入异步通道的概念,使用了Proactor,只有有效的请求才启动线程,特点是先由操作系统完成后,才通知服务器端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。

三种模型对比

Netty(1)

相关文章: