Connector

Connector 是 Tomcat 处理请求的主干,Servlet 请求通过 Connector 进行调度和控制

接收连接请求,创建 Request 和 Response 对象,分配线程让 Engine(Servlet 容器)来处理

Engine 处理完后,也通过 Connector 将响应返回

概念

NIO/BIO/APR 模式、线程池、连接数控制、几种 Connector

Connector 的 protocol

Tomcat7 支持 BIO、NIO 、APR; 8 加了NIO2;8.5 去BIO

APR 用本地库实现性能、扩展

Tomcat7 自动 BIO 或 APR

8 自动NIO 或 APR

BIO NIO 区别

连接与请求关系

连接 TCP 层(传输层),对应 socket

请求 HTTP 层(应用层),依赖于 TCP 的连接实现

一个 TCP 连接可传输多个 HTTP 请求

请求流程

accept 队列接收连接(客户端与 OS 完成三次握手建立了连接,OS 将连接放入 accept 队列)

连接中获取请求数据,生成 request,调 servlet 容器处理请求,返回 response

BIO Connector

JIoEndpoint 维护了 Acceptor 和 Worker(tomcat线程池)

Acceptor 接 socket,Worker 线程池找空闲的线程处理 socket

worker池满则 Acceptor 阻塞

NIO Connector

NIoEndpoint 包含 Acceptor 和 Worker 外,还用了 Poller

1

Acceptor 接 socket,线程处理请求仍阻塞

但 “读 socket 交 Worker 线程” 用NIO 实现,大并发效率显著提升

HTTP/1.1 默认 keep-alive true,长连接意味着

一个 TCP 的 socket 当前请求结束后,没新请求,socket 不立即释放,timeout 后再释放

BIO,“读 socket 交 Worker 线程”阻塞,意味着在 socket 等待下一个请求或等释放过程中,这 socket 工作线程一直被占用;Tomcat 可以同时处理的 socket 数目不能超过最大线程数,性能极大限制

NIO此过程非阻塞,socket 不占工作线程,Tomcat 同时处理 socket 数目远大于最大线程数,并发性能大大提高

acceptCount、maxThreads、maxConnections

无论 acceptCount 值多少,maxThreads 直接决定实际可同时处理请求数

而不管 maxThreads 如何,acceptCount 决定有多少请求等待处理

不管是可立即处理还是要放入等待区,都需要 tomcat 先接受该请求,maxConnections 值也会影响可同时处理的请求数


accept 队列满,拒绝进来的请求

acceptCount 默认 100

maxConnections

NIO 默认1W,APR 8192,BIO 默认maxThreads

windows APR 自动调整为设置值以下最大的 1024 的整数倍;设置 2000,最大值实际 1024

maxThreads 200,可自定义 Executor代替内置线程池