Tomcat IO模型 以及 开启HTTP/2

一、Tomcat  IO模型

Tomcat 支持多种 I/O 模型,包括传统的阻塞 I/O(BIO)、非阻塞 I/O(NIO)以及 APR 模式。实际使用哪个模型取决于 Tomcat 的版本和配置:

  • BIO 模式:较老版本或在配置中指定使用 org.apache.coyote.http11.Http11Protocol(或直接写 HTTP/1.1)时,Tomcat 会采用阻塞 I/O 模型,每个连接对应一个线程。
  • NIO 模式:在 Tomcat 8 及以后版本中,默认的连接器通常使用 org.apache.coyote.http11.Http11NioProtocol,即基于 Java NIO 的非阻塞 I/O 模型,能更好地支持高并发。
  • APR 模式:如果使用 Apache 的 Tomcat Native 库,则可以启用 APR 模式,从操作系统层面优化 I/O 性能。

二、Connector protocol 有几个选项

Tomcat Connector 的 protocol 属性主要有以下几种选项,各自对应不同的 I/O 模型和实现方式:

  1. HTTP/1.1
    – 这是一个简写值,在 Tomcat 7 及以后的版本中,如果在配置中写上 “HTTP/1.1”,Tomcat 会根据运行环境自动选择具体的实现。
    – 在 Tomcat 8 中,默认通常会选用 NIO 模型(即“org.apache.coyote.http11.Http11NioProtocol”)来处理请求。
    – 这种方式简化了配置,但如果需要精细控制,建议直接指定具体的实现类。

  2. org.apache.coyote.http11.Http11Protocol
    – 这是基于传统阻塞 I/O(BIO)的实现。
    – 每个 TCP 连接都会由一个独立的线程进行处理,线程阻塞直到请求完成。
    – BIO 模型实现简单,但在高并发环境下,由于线程数受限,扩展性较差。

  3. org.apache.coyote.http11.Http11NioProtocol
    – 这是基于 Java NIO(Non-blocking I/O)的实现。
    – 利用 Selector 和非阻塞 SocketChannel,可以用较少的线程管理大量并发连接。
    – Tomcat 8(以及8.5)的默认 Connector 就是采用这种模式,它能更好地支持高并发请求。

  4. org.apache.coyote.http11.Http11Nio2Protocol
    – 这是基于 Java NIO.2(引入于 Java 7)的异步 I/O 实现。
    – 相对于传统 NIO,它使用 AsynchronousSocketChannel 和回调机制,可以在某些场景下进一步提高扩展性和资源利用率。
    – 使用 NIO2 需要 JDK 7 及以上,并且在实际性能表现上会受到底层操作系统异步 I/O 支持的影响。

  5. org.apache.coyote.http11.Http11AprProtocol
    – 这是基于 APR(Apache Portable Runtime)及其 native 库实现的 Connector。
    – 通过调用本地 C 库(以及 OpenSSL 等)来优化 I/O 操作和 SSL 加解密,通常能提供更高的性能和更低的延迟,特别适合高并发场景。
    – 启用 APR 模式需要预先安装并配置相应的本地库(如 apr、apr-util 及 tomcat-native),在 Windows 平台下其默认连接数也会受到一些特定调整。

总结来说,不同的 protocol 选项对应着不同的 I/O 处理机制:

  • BIO(Http11Protocol):简单但扩展性较差,每个连接阻塞一个线程;
  • NIO(Http11NioProtocol):基于非阻塞 I/O,适合高并发,Tomcat 8/8.5 默认选项;
  • NIO2(Http11Nio2Protocol):利用异步 I/O 回调,进一步优化资源使用;
  • APR(Http11AprProtocol):依赖本地库,能获得更高性能,但部署和配置复杂度较高。

三、Tomcat 8 使用 nio后,同时可以支持多少 客户端连接

tomcat 支持多少客户端连接是由 Connector maxConnections 属性决定的,nio 只是说 能以较少的线程来维护大量的连接

具体能支持多少客户端连接,主要取决于两个因素:

  1. 配置参数:在 server.xml 中,Connector 有一个属性 maxConnections,它定义了能同时接受的最大连接数。对于 NIO 连接器,这个默认值通常设置为 10,000,但可以根据需求和系统能力进行调整。

  2. 系统资源限制:实际能支持的连接数还受到操作系统(例如文件描述符限制、内存等)的限制。在适当调整系统资源和优化配置后,Tomcat 8 在 NIO 模式下有可能支持超过 10,000 个同时连接。

因此,理论上在默认配置下,Tomcat 8 的 NIO 连接器可以同时支持大约 10,000 个客户端连接,而在经过适当调优后,可支持的连接数可能更高。

四、假设 Tomcat 8 同时有 500个客户端连接上了,同时可以有多少个请求

在 Tomcat 8 中,建立 500 个 TCP 连接并不意味着同时能处理 500 个 HTTP 请求。实际上,Tomcat 会用一个线程来处理一个处于活动状态的请求,而默认情况下它的 maxThreads 参数通常设为 200(当然,这个数值可以通过配置进行调整)。

也就是说,当 500 个客户端都保持连接时,如果所有客户端同时发送请求,那么只有最多约 200 个请求能够被 Tomcat 同时“激活”处理,其余的请求则会在内部等待队列中排队,直到有工作线程空闲为止。

因此,在默认配置下,500 个连接环境下同时能处理的 HTTP 请求数大约受限于 maxThreads,即约 200 个请求。

五、Tomcat 8 设置 connector maxConnections 10,tomcat maxThreads 200,那同时最多能有几个请求

在 Tomcat 8 中,maxConnectionsmaxThreads 是影响服务器并发能力的两个关键参数maxConnections 指定了服务器在任意时刻能够接受和处理的最大连接数,而 maxThreads 则定义了用于处理请求的最大线程数。

在这种配置下,Tomcat 同时最多能处理 10 个请求。如果同时有超过 10 个连接请求,超出的请求将被拒绝或进入等待队列,具体行为取决于其他相关配置,如 acceptCount,它定义了在达到最大连接数后,服务器可以接受的等待连接数。

六、Tomcat 8 一个 tcp连接 可以同时发出两个 http请求吗

在 HTTP/1.1 协议下(Tomcat 8 默认使用的是 HTTP/1.1),一个 TCP 连接一次只能处理一个 HTTP 请求。虽然 HTTP/1.1 支持“流水线”(pipelining),允许客户端连续发送多个请求,但服务器会依次返回响应,且响应必须按请求的顺序返回,因此实际上不会实现真正的并发处理。

而如果启用了 HTTP/2(Tomcat 8.5 及以上版本支持 HTTP/2),则可以在一个 TCP 连接上通过多路复用同时处理多个 HTTP 请求和响应。

所以,答案是:

  • 在 HTTP/1.1 模式下,一个 TCP 连接不能同时发出两个独立的 HTTP 请求进行并发处理。
  • 在 HTTP/2 模式下,一个 TCP 连接可以同时发出多个 HTTP 请求。

七、Tomcat 8.5 开启 HTTP/2,设置 connector maxConnections 10,tomcat maxThreads 200,那同时最多能有几个请求

由于 HTTP/2 的多路复用特性,一个连接可以承载多个并发请求,因此 maxConnections 的限制对并发请求数量的影响有所降低。在这种情况下,maxThreads 成为决定并发处理能力的主要因素。即使 maxConnections 设置为 10,但由于每个连接可以处理多个请求,实际的并发请求数量取决于 maxThreads 的设置。

maxThreads 设置为 200,意味着服务器最多可以同时处理 200 个请求

八、Tomcat 8.5 怎么开启 HTTP/2 模式

在 Tomcat 8.5 中启用 HTTP/2 主要需要满足以下条件:

  1. 使用 TLS 加密连接
    HTTP/2 在 Tomcat 中目前仅支持在 HTTPS(TLS)连接上使用。

  2. 使用支持 ALPN 的 JDK 或 APR/native
    建议使用 Java 9 及以上版本(或其他支持 ALPN 的 JDK),或者配置 APR/native 及 OpenSSL。

  3. 修改 Connector 配置
    编辑 Tomcat 的 conf/server.xml,将 HTTPS Connector 的 protocol 属性设置为支持 NIO2 的协议(例如:org.apache.coyote.http11.Http11Nio2Protocol),然后在该 Connector 内部添加 UpgradeProtocol 元素来启用 HTTP/2。

例如,下面是一个典型的配置示例:

<Connector port="8443"
           protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           maxThreads="150" SSLEnabled="true"
           scheme="https" secure="true"
           keystoreFile="conf/keystore.jks" keystorePass="yourKeystorePassword">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>

配置完成后,重启 Tomcat,客户端(如果支持 HTTP/2)会通过 TLS 协商自动升级至 HTTP/2 协议。

为什么要配置 ssl

虽然 HTTP/2 协议本身并未强制要求使用加密,但大多数浏览器(如 Firefox、Chrome、Safari、Opera、IE、Edge)仅在通过 TLS 加密的连接上支持 HTTP/2,这使得加密连接成为实际标准。因此,为了在实际应用中实现 HTTP/2,配置 SSLHostConfig 以启用 HTTPS 是必要的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值