7.6 Web 服务器 摘要:Java Web 服务器是构建现代企业级应用与微服务架构的核心基础设施。本文深入解析 Java Web 服务器的底层运行机制,详细对比 Tomcat 与 Jetty 两大主流 Servlet 容器的特性与实战部署方案。通过剖析 HTTP 请求处理流程、目录结构及生产环境配置优化策略,为开发者提供全面的 Java Web 服务器技术指南。 7.6.1 Web 服务器概述与核心机制 Web 服务器本质上是一个监听特定网络端口(默认通常为 80 或 443)的软件程序,负责接收并处理客户端的 HTTP 请求。当收到请求时,服务器会解析请求头和请求体,并根据请求方法(GET、POST、PUT、DELETE 等)和 URL 路径,执行相应的处理逻辑。
摘要:Java Web 服务器是构建现代企业级应用与微服务架构的核心基础设施。本文深入解析 Java Web 服务器的底层运行机制,详细对比 Tomcat 与 Jetty 两大主流 Servlet 容器的特性与实战部署方案。通过剖析 HTTP 请求处理流程、目录结构及生产环境配置优化策略,为开发者提供全面的 Java Web 服务器技术指南。
Web 服务器本质上是一个监听特定网络端口(默认通常为 80 或 443)的软件程序,负责接收并处理客户端的 HTTP 请求。当收到请求时,服务器会解析请求头和请求体,并根据请求方法(GET、POST、PUT、DELETE 等)和 URL 路径,执行相应的处理逻辑。其核心处理机制包括:
在 Java 生态中,常见的 Web 服务器(Servlet 容器)包括:
Tomcat 作为一个成熟且轻量级的 Servlet 容器,完美平衡了性能与易用性,非常适合用于开发和部署中大型 Java Web 应用。
从 Apache Tomcat 官网下载对应版本的二进制发行版(Core),解压至本地目标目录。为确保系统级命令可用,需配置环境变量:
CATALINA_HOME 指向 Tomcat 的安装根目录。JAVA_HOME。Tomcat 的标准化目录结构设计清晰,各模块职责分明:
tomcat/ ├── bin/ # 存放启动、停止及环境变量配置脚本(如 startup.sh, catalina.sh) ├── conf/ # 核心配置文件目录(包含 server.xml, web.xml, context.xml) ├── lib/ # Tomcat 运行及 Web 应用共享依赖的 JAR 包 ├── logs/ # 运行日志、访问日志及错误日志输出目录 ├── temp/ # JVM 运行时产生的临时文件目录 ├── webapps/ # 默认的 Web 应用部署根目录 └── work/ # JSP 编译后的 Servlet 源码及 Class 文件缓存目录
.war 文件直接放入 webapps 目录,Tomcat 启动时会自动解压并部署。conf/server.xml 的 <Host> 标签内配置 <Context>,将物理路径映射到指定的上下文路径(Context Path),避免频繁移动大型项目文件。在 bin 目录下执行相应的脚本:
./startup.sh 启动,./shutdown.sh 停止。startup.bat 启动,shutdown.bat 停止。编写一个基础的 HTTP GET 请求处理 Servlet:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>Hello, Java Web Server!</h1>"); out.println("</body></html>"); } }
若不使用注解,可通过 WEB-INF/web.xml 进行传统 XML 配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.example.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
将编译后的 .class 文件置于 WEB-INF/classes 目录下,将整个项目文件夹部署至 webapps,启动 Tomcat 后访问 http://localhost:8080/项目名/hello 即可验证。
Jetty 以其异步非阻塞 I/O 模型和极小的内存足迹,在微服务架构、物联网(IoT)网关及开发测试环境中占据重要地位。
从 Eclipse Jetty 官网下载发行版并解压。其目录结构与 Tomcat 类似,但配置文件集中在 etc/ 目录下(如 jetty.xml)。将 WAR 包放入 webapps 后,通过 bin/jetty.sh start 即可启动服务。
jetty/ ├── bin/ # 启停脚本及环境配置 ├── etc/ # 核心配置文件(jetty.xml, jetty-http.xml 等) ├── lib/ # Jetty 核心模块及扩展依赖库 ├── logs/ # 日志输出目录 ├── resources/ # 全局静态资源及配置属性文件 ├── temp/ # 临时文件目录 └── webapps/ # Web 应用部署目录
Jetty 最大的优势在于可以作为依赖库直接嵌入到 Java 应用程序中,实现“应用即服务器”,彻底免去外部容器的安装与配置。
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class EmbeddedJettyApp { public static void main(String[] args) throws Exception { // 实例化 Jetty 服务器并监听 8080 端口 Server server = new Server(8080); // 配置 Servlet 上下文 ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); server.setHandler(context); // 注册自定义 Servlet context.addServlet(new ServletHolder(new HelloServlet()), "/api/hello"); // 启动服务器并阻塞主线程 server.start(); server.join(); } }
通过引入 jetty-server 和 jetty-servlet Maven 依赖,上述代码即可在数秒内启动一个完整的 Web 服务,这正是 Spring Boot 默认内嵌 Tomcat/Jetty 的底层实现原理。
Web 服务器处理 HTTP 请求的完整生命周期涉及网络 I/O、协议解析、路由分发及业务执行。以下为标准的工作流程图示:
核心流程解析:
.css, .js, .png),则直接从磁盘读取文件。HttpServletRequest 对象,交由对应的 Servlet 或 Filter 链处理。HttpServletResponse,设置状态码(如 200 OK)及响应头(如 Content-Type)。在真实的生产环境中,Web 服务器的默认配置通常无法满足高并发需求,必须针对以下维度进行深度调优:
maxThreads(最大工作线程数)、minSpareThreads(最小空闲线程数)和 acceptCount(等待队列长度),防止高并发下的线程耗尽或请求拒绝。<Host> 实现单实例多域名部署;严格限制 Context 的 reloadable 属性为 false,避免生产环境下的热部署性能损耗。Web 服务器是 Java Web 生态的流量入口与运行基石。Tomcat 凭借其稳定性和广泛的社区支持,依然是传统企业级应用独立部署的首选;而 Jetty 则凭借其轻量、异步和易嵌入的特性,在云原生与微服务架构中大放异彩。
本章核心知识点涵盖:
深入掌握 Web 服务器的底层机制与配置策略,不仅是排查线上性能瓶颈的前提,更是构建高可用、高并发 Java 分布式系统的必经之路。合理选择并优化 Servlet 容器,将为上层业务架构提供坚实可靠的底层支撑。