NIO与BIO

当谈到 Java 网络编程时,经常会听到两个重要的概念:BIO(Blocking I/O,阻塞 I/O)和 NIO(Non-blocking I/O,非阻塞 I/O)。它们都是 Java 中用于处理 I/O 操作的不同编程模型。

一、介绍

1. BIO(Blocking I/O)

BIO 是 Java 最早的 I/O 模型,也是最简单的一种。在 BIO 模型中,每个 I/O 操作都会阻塞当前线程,直到数据准备就绪或者超时,才会继续执行下一步操作。这意味着如果有大量的并发连接,就需要创建大量的线程来处理这些连接,会造成资源浪费和性能下降。

在 BIO 模型中,通常采用的是一对一的客户端-服务器模型,即每个客户端连接都需要对应一个服务器端的线程来处理。这样的模型适用于连接数较少且连接持续时间较长的场景,但不适合高并发、短连接的场景。

2. NIO(Non-blocking I/O)

NIO 是 Java 在 JDK 1.4 引入的新的 I/O 模型,相比于 BIO,它提供了更为灵活和高效的网络编程方式。NIO 主要通过以下几个核心组件来实现非阻塞 I/O:

  • 通道(Channel):提供了全双工、非阻塞的数据传输通道,可以通过通道读取和写入数据。
  • 缓冲区(Buffer):用于在通道和应用程序之间传输数据的中介,存储读取或写入的数据。
  • 选择器(Selector):用于监听多个通道的事件,当通道发生读写事件时,可以通过选择器来选择感兴趣的事件进行处理。

NIO 模型中的关键是非阻塞通道和选择器。通过使用单线程或少量线程配合选择器,可以实现同时处理多个连接,从而提高了系统的并发处理能力。

NIO 模型适用于高并发、短连接的场景,如 Web 服务器、游戏服务器等。它的设计理念是通过少量线程处理大量并发连接,避免了线程资源的浪费和上下文切换的开销,从而提高了系统的性能和吞吐量。

"Non-blocking I/O"(非阻塞 I/O)通常也被称为 "New I/O"(新 I/O)。在 Java 中,NIO(New I/O)包提供了一套非阻塞的 I/O 操作方式,因此人们常常将其简称为 "New I/O"。这个术语可能源自于 Java 1.4 版本中引入 NIO 的时代,当时这种非阻塞 I/O 模型被认为是一种新的、先进的技术。

所以,虽然 "New I/O" 并不是一个严格意义上的术语,但在 Java 社区中,它通常被用来指代 NIO(Non-blocking I/O)相关的技术和包。

3、总结

BIO 和 NIO 是 Java 中常用的两种 I/O 模型,各有优缺点:

  • BIO 简单易懂,适用于连接数较少且连接持续时间较长的场景,但在高并发情况下性能较差。
  • NIO 提供了非阻塞、多路复用的网络编程方式,适用于高并发、短连接的场景,能够提高系统的性能和吞吐量,但编程复杂度较高。

二、Tomcat文件配置

在Tomcat的配置文件中也涉及到NIO(Non-blocking I/O,即非阻塞 I/O)与BIO(Blocking I/O,阻塞式I/O)的设置。

Tomcat 是一个流行的开源的 Java Servlet 容器,用于实现 Java Servlet 和 JavaServer Pages 技术。它支持多种 I/O 模型,包括 NIO 和 BIO。

在 Tomcat 的配置文件中,一般通过 Connector 元素配置连接器,其中的 protocol 属性用于指定使用的协议。在使用 NIO 或 BIO 时,通常会设置对应的协议,如下所示:

<!-- 使用NIO协议 -->
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="20000"
           redirectPort="8443" />

<!-- 使用BIO协议 -->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

在上面的示例中,当 protocol 属性设置为 org.apache.coyote.http11.Http11NioProtocol 时,表示使用 NIO 协议;当 protocol 属性设置为 HTTP/1.1 时,表示使用 BIO 协议。

通过配置连接器的协议,可以选择不同的 I/O 模型来处理请求,以满足应用程序的性能和需求。 NIO 模型相比 BIO 模型具有更好的性能和扩展性,特别适用于高并发的场景。

三、NGINX 的配置相关

在 NGINX 的配置中,并没有像 Tomcat 那样直接涉及到具体的 I/O 模型的配置选项。NGINX 是一个高性能的 Web 服务器,它使用了事件驱动的异步架构来处理连接和请求,但是具体的事件驱动模型对用户是透明的,不需要用户手动配置。

NGINX 的事件驱动模型默认使用了 epoll(在 Linux 上)或 kqueue(在 BSD 和 macOS 上)等高性能的事件模型,以实现高并发、高吞吐量的请求处理。这些细节对于用户来说是不可见的,NGINX 会根据系统和编译时的参数自动选择最佳的事件模型,并且在大多数情况下不需要用户进行额外的配置。

因此,在 NGINX 的配置文件中,一般不需要关心具体的 I/O 模型,用户只需要关注配置 NGINX 的监听端口、虚拟主机、反向代理、负载均衡等功能即可。

四、涉及到的框架与中间件

在Java生态系统中,许多中间件和框架都涉及到了NIO(New I/O)和BIO(Blocking I/O)的使用,以实现高性能的网络通信。以下是一些常见的中间件和框架,它们可能涉及到NIO和BIO:

  1. Netty:Netty 是一个高性能的异步事件驱动的网络应用框架,它基于 NIO 实现了网络通信的高性能和可扩展性。

  2. Apache MINA:Apache MINA 是一个基于 Java 的网络应用框架,提供了可扩展的高性能的基于 NIO 的网络通信。

  3. Tomcat:Tomcat 是一个流行的 Java Servlet 容器,它在处理 HTTP 请求时可以选择使用 NIO 或 BIO,通过配置 Connector 的协议来指定。

  4. Jetty:Jetty 是另一个流行的 Java Servlet 容器和 Web 服务器,它也支持使用 NIO 或 BIO 来处理网络连接。

  5. Apache HTTP Server:Apache HTTP Server 是世界上最流行的 Web 服务器之一,它在处理 HTTP 请求时可以使用 NIO 或者传统的多线程模型。

  6. Redis:Redis 是一个内存数据库,它的网络通信层使用了 NIO 来实现高性能的异步 I/O。

  7. MySQL Connector/J:MySQL 的 Java 连接器,它可以使用 NIO 来实现异步的数据库访问。

  8. Spring Framework:Spring Framework 是一个全面的 Java 开发框架,其中的 Spring Web 模块在处理 HTTP 请求时可以选择使用 NIO 或者传统的阻塞 I/O。

这些是常见的一些中间件和框架,在网络通信方面涉及到了 NIO 和 BIO 的使用。选择适合的 I/O 模型可以根据具体的应用场景和性能需求来决定,以提高系统的性能和吞吐量。

相关推荐
石牌桥网管30 分钟前
OpenSSL 生成根证书、中间证书和网站证书
网络协议·https·openssl
阿尔帕兹7 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
FeelTouch Labs7 小时前
Netty实现WebSocket Server是否开启压缩深度分析
网络·websocket·网络协议
千天夜9 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
follycat10 小时前
[极客大挑战 2019]HTTP 1
网络·网络协议·http·网络安全
earthzhang202111 小时前
《深入浅出HTTPS》读书笔记(5):随机数
网络协议·http·https
xiaoxiongip66611 小时前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
JaneJiazhao11 小时前
HTTPSOK:SSL/TLS证书自动续期工具
服务器·网络协议·ssl
JaneJiazhao11 小时前
HTTPSOK:智能SSL证书管理的新选择
网络·网络协议·ssl
城南vision13 小时前
计算机网络——HTTP篇
网络协议·计算机网络·http