Tomcat 有几个连接器可供选择。我将把 APR 连接器放在一边,专注于 BIO 和 NIO。
BIO 连接器(阻塞 I/O)是阻塞的——它使用一个线程池,其中每个线程接收请求、处理请求、响应并返回到池中。在阻塞操作(例如从数据库读取或调用外部 API)期间,线程被阻塞。
NIO 连接器(非阻塞 I/O)有点 复杂 。它使用 java NIO 库并在请求之间进行多路复用。它有两个线程池——一个包含轮询器线程,它处理所有传入的请求并将这些请求推送到另一个池中的工作线程处理。两种池大小都是可配置的。
何时选择 NIO 与 BIO 取决于用例。如果您主要使用常规的请求-响应,那么没关系,甚至 BIO 可能是更好的选择(如 我之前的基准测试 所示)。如果您有长期连接,那么 NIO 是更好的选择,因为它可以为更多并发用户提供服务,而无需为每个用户分配一个阻塞线程。轮询线程处理将数据发送回客户端,而工作线程处理新请求。换句话说,轮询器和工作线程都不会被单个用户阻塞和保留。
随着 异步处理 servlet 的引入,上一段中的后一种情况变得更加容易。也许这就是在 Tomcat 8 中将默认连接器从 BIO 切换到 NIO 的原因之一。记住这一点很重要,尤其是因为它们并没有完全更改“默认值”。
默认值始终为“HTTP/1.1”,但在 Tomcat 7 中“使用自动切换机制来选择 基于阻塞 Java 的连接器或基于 APR/本机的连接器”,而在 Tomcat 8 中“使用自动切换选择基于 非阻塞 Java NIO 的连接器或基于 APR/native 的连接器的机制”。更难的是,他们引入了 NIO2 连接器。老实说,我不知道默认使用两个 NIO 连接器中的哪一个。
因此,即使您熟悉 tomcat 配置,也请记住这种默认设置的更改。 (通常我建议阅读所有属性的 文档 并在您的服务器上使用它们)