【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Tomcat 的工作原理:从启动到请求处理的流程
<前文回顾>
<今日更新>
一、Tomcat 的启动:从“开机”到“待机”
Tomcat[1] 的启动流程,说白了就是从“开机”到“待机”的过程。启动时,Tomcat 会加载配置、初始化组件、启动服务啥的,最后进入“待机”状态,等着处理请求。
1. 加载配置:Tomcat 的“开机自检”
Tomcat 启动时,首先会加载配置文件,比如 server.xml、web.xml 啥的。这些配置文件决定了 Tomcat 的行为,比如端口号、上下文路径、线程池大小啥的。
XML Code |
<!-- server.xml 配置端口号 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> |
2. 初始化组件:Tomcat 的“组装零件”
Tomcat 加载完配置后,会初始化各种组件,比如 Connector、Engine、Host、Context 啥的。这些组件是 Tomcat 的“零件”,它们各司其职,共同处理请求。
Java Code |
// Connector 初始化 Connector connector = new Connector("HTTP/1.1"); connector.setPort(8080); connector.setProtocol("HTTP/1.1"); |
3. 启动服务:Tomcat 的“点火启动”
Tomcat 初始化完组件后,会启动各种服务,比如 Connector、Engine 啥的。启动服务后,Tomcat 就进入“待机”状态,等着处理请求。
Java Code |
// 启动 Connector connector.start(); |
二、Tomcat 的请求处理:从“接单”到“交货”
Tomcat 的请求处理流程,说白了就是从“接单”到“交货”的过程。请求到达 Tomcat 后,Tomcat 会解析请求、匹配上下文、调用 Servlet 啥的,最后生成响应,返回给客户端。
1. 解析请求:Tomcat 的“接单”
请求到达 Tomcat 后,Tomcat 会解析请求,提取请求头、请求体啥的。解析请求后,Tomcat 就知道该“干啥”了。
Java Code |
// 解析请求 HttpServletRequest request = (HttpServletRequest) req; String method = request.getMethod(); String uri = request.getRequestURI(); |
2. 匹配上下文:Tomcat 的“找地方”
Tomcat 解析完请求后,会根据请求的 URL,匹配对应的上下文(Context)。上下文是 Tomcat 的“工作区”,里头装着 Servlet、Filter 啥的。
Java Code |
// 匹配上下文 Context context = host.findChild(contextPath); |
3. 调用 Servlet:Tomcat 的“干活”
Tomcat 匹配完上下文后,会调用对应的 Servlet,处理请求。Servlet 是 Tomcat 的“工人”,它负责处理业务逻辑,生成响应。
Java Code |
// 调用 Servlet Servlet servlet = context.map(request); servlet.service(request, response); |
4. 生成响应:Tomcat 的“交货”
Servlet 处理完请求后,会生成响应,返回给客户端。Tomcat 会把响应“包装”成 HTTP 响应,发送给客户端。
Java Code |
// 生成响应 HttpServletResponse response = (HttpServletResponse) res; response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("Hello, World!"); |
三、Tomcat 的组件:从“零件”到“机器”
Tomcat 的组件是它的“零件”,它们各司其职,共同处理请求。Tomcat 的主要组件包括 Connector、Engine、Host、Context 啥的。
1. Connector:Tomcat 的“接线员”
Connector 是 Tomcat 的“接线员”,它负责接收请求、解析请求、发送响应啥的。Connector 的配置通常写在 server.xml 里。
XML Code |
<!-- server.xml 配置 Connector --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> |
2. Engine:Tomcat 的“总控台”
Engine 是 Tomcat 的“总控台”,它负责管理 Host、Context 啥的。Engine 的配置通常写在 server.xml 里。
XMl Code |
<!-- server.xml 配置 Engine --> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" /> </Engine> |
3. Host:Tomcat 的“车间”
Host 是 Tomcat 的“车间”,它负责管理 Context 啥的。Host 的配置通常写在 server.xml 里。
XML Code |
<!-- server.xml 配置 Host --> <Host name="localhost" appBase="webapps"> <Context path="/myapp" docBase="myapp" /> </Host> |
4. Context:Tomcat 的“工作台”
Context 是 Tomcat 的“工作台”,它负责管理 Servlet、Filter 啥的。Context 的配置通常写在 server.xml 或者 web.xml 里。
XML COde |
<!-- server.xml 配置 Context --> <Context path="/myapp" docBase="myapp" /> |
四、Tomcat 的参数:从“默认值”到“调校”
Tomcat 的参数是它的“调校”,开发者能通过配置参数,调整 Tomcat 的性能、行为啥的。Tomcat 的主要参数包括端口号、线程池大小、连接超时啥的。
1. 端口号:Tomcat 的“门牌号”
端口号是 Tomcat 的“门牌号”,用户得通过端口号访问 Tomcat。Tomcat 的默认端口号是 8080,但生产环境通常得改成 80。
XML Code |
<!-- server.xml 配置端口号 --> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 运行 HTML |
2. 线程池:Tomcat 的“发动机”
线程池是 Tomcat 的“发动机”,Tomcat 用线程池处理请求。线程池的大小得根据硬件资源、请求量啥的“调校”。
XML Code |
<!-- server.xml 配置线程池 --> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="200" minSpareThreads="10" /> |
3. 连接超时:Tomcat 的“耐心”
连接超时是 Tomcat 的“耐心”,它决定了 Tomcat 等待客户端请求的时间。连接超时通常得根据网络状况、请求量啥的“调校”。
XML Code |
<!-- server.xml 配置连接超时 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> |
五、Tomcat 的历史:从“小工具”到“大机器”
Tomcat 从 1999 年诞生到现在,已经走过了 20 多个年头。虽然现在 Tomcat 已经有点“过气”了,但它的“历史”还是挺“辉煌”的。
1. Tomcat 3.x:初代“小工具”
Tomcat 3.x 在 1999 年发布,是 Tomcat 的“初代版本”。虽然功能简单,但已经能满足大部分开发需求了。
2. Tomcat 4.x:引入 Catalina
Tomcat 4.x 在 2001 年发布,引入了 Catalina,让 Tomcat 的架构更加“模块化”。Catalina 的引入,让 Tomcat 的“玩法”更加丰富。
3. Tomcat 5.x:支持 Servlet 2.4
Tomcat 5.x 在 2003 年发布,支持 Servlet 2.4,让 Tomcat 的功能更加强大。Servlet 2.4 的引入,让 Tomcat 的“玩法”更加灵活。
4. Tomcat 6.x:支持 Servlet 2.5
Tomcat 6.x 在 2006 年发布,支持 Servlet 2.5,让 Tomcat 的功能更加强大。Servlet 2.5 的引入,让 Tomcat 的“玩法”更加灵活。
5. Tomcat 7.x:支持 Servlet 3.0
Tomcat 7.x 在 2011 年发布,支持 Servlet 3.0,让 Tomcat 的功能更加强大。Servlet 3.0 的引入,让 Tomcat 的“玩法”更加灵活。
6. Tomcat 8.x:支持 Servlet 3.1
Tomcat 8.x 在 2014 年发布,支持 Servlet 3.1,让 Tomcat 的功能更加强大。Servlet 3.1 的引入,让 Tomcat 的“玩法”更加灵活。
7. Tomcat 9.x:支持 Servlet 4.0
Tomcat 9.x 在 2018 年发布,支持 Servlet 4.0,让 Tomcat 的功能更加强大。Servlet 4.0 的引入,让 Tomcat 的“玩法”更加灵活。
专有名词解释:
- Tomcat:Apache Tomcat,一个开源的 JavaWeb 服务器,用于运行 Servlet 和 JSP。
- Connector:Tomcat 的组件,负责接收请求、解析请求、发送响应等。
- Engine:Tomcat 的组件,负责管理 Host、Context 等。
- Host:Tomcat 的组件,负责管理 Context 等。
- Context:Tomcat 的组件,负责管理 Servlet、Filter 等。
- Servlet:Java 编写的服务器端程序,用于处理客户端请求并生成动态 Web 内容。